Java 流 - 在可为空列表上执行流的优雅方法

way*_*yne 3 java nullpointerexception java-stream option-type

这已经困扰我一段时间了。
所以我有一个Product类,其中包含一个列表Image(该列表可能为空)。
我想要做

product.getImages().stream().filter(...)
Run Code Online (Sandbox Code Playgroud)

但由于product.getImages()可能为空,我不能直接执行上面的操作,而是必须用它来包装它Optional.ofNullable(...).ifPresent(...)

Optional.ofNullable(product.getImages())
    .ifPresent(imgs->imgs.stream().filter(...))
Run Code Online (Sandbox Code Playgroud)

对我来说,即使与以下相比,它看起来也很麻烦:

if(product.getImages() != null){
    product.getImages().stream().filter(...)
}
Run Code Online (Sandbox Code Playgroud)

假设我无法更改Product::getImages(使其不返回 null),是否有更优雅的方法?

Swe*_*per 7

如果可选项为空Optional.stream,它会为您提供一个空流,否则它是由可选项包装的元素的单例流。

你可以这样做:

Stream<Image> imageStream = 
    Optional.ofNullable(product.getImages())
        .stream()
        .flatMap(Collection::stream)
        .filter(...);
Run Code Online (Sandbox Code Playgroud)

imageStream如果返回 null 则为空getImages

还有Stream.ofNullable(感谢Holger提醒!),可以替代Optional.ofNullable(product.getImages()).stream()

Stream<Image> imageStream = 
    Stream.ofNullable(product.getImages())
        .flatMap(Collection::stream)
        .filter(...);
Run Code Online (Sandbox Code Playgroud)