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(...);
这个问题困扰了我一段时间。
所以我有一个 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(...);