从可为空的列表创建Java 8流

时间:2018-06-24 09:49:07

标签: java java-8 java-stream

是否有一种方法可以检查java8中的null,如果list为null则返回null,否则执行操作。

 public Builder withColors(List<String> colors) {
        this.colors= colors== null ? null :
                colors.stream()
                .filter(Objects::nonNull)
                .map(color-> Color.valueOf(color))
                .collect(Collectors.toList());

        return this;
    }

我看到可以使用

Optional.ofNullable(list).map(List::stream) 

但是以这种方式,我在Color.valueOf(color)上得到错误代码

谢谢

2 个答案:

答案 0 :(得分:2)

Optional.ofNullable(list).map(List::stream)会给您一个Optional<Stream<String>>,您无法对其打filter

您可以将整个Stream处理放入Optional的{​​{1}}中:

map()

答案 1 :(得分:2)

您可能需要重新考虑几件事。

首先可能要通过Set<String> colors而不是List,因为似乎Color是一个枚举。然后,可能更有意义的是检查equalsIgnoreCase,以便redRED仍会产生一个枚举实例。同样,if statement可能更清楚地检查可能为空的输入。最后一个相反方向的流-从enum开始更有意义(也避免了空检查),为了简单起见,我没有实现上述建议。

public Builder withColors(List<String> colors) {
    if(colors == null){
        this.colors = Collection.emptyList();
    }

    this.colors = EnumSet.allOf(Color.class)
            .stream()
            .filter(x -> colors.stream().anyMatch(y -> x.toString().equals(y)))
            .collect(Collectors.toList());
    return this;
}