Java stream - 在可空列表上执行流的优雅方式

Java stream - elegant way to do stream on nullable list

这个问题困扰了我一段时间。
所以我有一个 Product class,它有一个 Image 的列表(该列表可能为空)。
我想做

product.getImages().stream().filter(...)

但由于 product.getImages() 可能为空,我不能直接在上面做,而是必须用 Optional.ofNullable(...).ifPresent(...)

包装它
Optional.ofNullable(product.getImages())
    .ifPresent(imgs->imgs.stream().filter(...))

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

if(product.getImages() != null){
    product.getImages().stream().filter(...)
}

假设我不能改变Product::getImages(让它不return null),有没有更优雅的方法?

Optional.stream,如果optional为空,它给你一个空流,否则它是一个被optional包裹的元素的单例流。

您可以这样做:

Stream<Image> imageStream = 
    Optional.ofNullable(product.getImages())
        .stream()
        .flatMap(Collection::stream)
        .filter(...);
如果 getImages returns 为空,

imageStream 将为空。

还有Stream.ofNullable (thanks to Holger提醒一下!),可以代替Optional.ofNullable(product.getImages()).stream()

Stream<Image> imageStream = 
    Stream.ofNullable(product.getImages())
        .flatMap(Collection::stream)
        .filter(...);