[英]How to best create a Java 8 stream from a nullable object?
在获取流之前进行空检查的最佳/惯用方法是什么?
我有接收一个可能为空的List
方法。 所以我不能只对传入的值调用.stream()
。 如果值为空,是否有一些静态助手会给我一个空流?
我同意Stuart Marks 的list == null ? Stream.empty() : list.stream()
list == null ? Stream.empty() : list.stream()
是正确的方法(请参阅他的答案),或者至少是在 Java 9 之前执行此操作的正确方法(请参阅下面的编辑),但我会留下这个答案up 来演示 Optional API 的用法。
<T> Stream<T> getStream(List<T> list) {
return Optional.ofNullable(list).map(List::stream).orElseGet(Stream::empty);
}
编辑: Java 9 添加了静态工厂方法Stream.<T>ofNullable(T)
,它返回给定null
参数的空流,否则返回以该参数作为唯一元素的流。 如果参数是一个集合,那么我们可以使用flatMap
将其转换为流。
<T> Stream<T> fromNullableCollection(Collection<? extends T> collection) {
return Stream.ofNullable(collection).flatMap(Collection::stream);
}
这不会像 Stuart Marks 所讨论的那样滥用 Optional API,并且与三元运算符解决方案相比,没有机会出现空指针异常(就像您没有注意并搞砸了操作数的顺序)。 它还不需要的上界通配符的工作SuppressWarnings("unchecked")
这要归功于签名flatMap
,这样你就可以得到一个Stream<T>
从任何亚型的元素的集合T
。
我能想到的最好的事情是将Optional
与orElseGet
方法一起使用。
return Optional.ofNullable(userList)
.orElseGet(Collections::emptyList)
.stream()
.map(user -> user.getName())
.collect(toList());
更新Collections::emptyList
建议使用Collections::emptyList
over ArrayList::new
在其他答案中, Optional
实例是在同一语句中严格创建和使用的。 Optional
类主要用于与调用者就返回值的存在或不存在进行通信,如果存在则与实际值融合。 在单一方法中完全使用它似乎没有必要。
让我提出以下更平淡的技巧:
static <T> Stream<T> nullableListToStream(List<T> list) {
return list == null ? Stream.empty() : list.stream();
}
我猜现在三元运算符有点过时了,但我认为这是最简单和最有效的解决方案。
如果我是真实写的(也就是说,对于一个真正的库,而不仅仅是 Stack Overflow 上的示例代码),我会放入通配符,以便流返回类型可以与 List 类型不同。 哦,它可以是一个集合,因为它是定义stream()
方法的地方:
@SuppressWarnings("unchecked")
static <T> Stream<T> nullableCollectionToStream(Collection<? extends T> coll) {
return coll == null ? Stream.empty() : (Stream<T>)coll.stream();
}
(警告抑制是必要的,因为从Stream<? extends T>
到Stream<T>
是安全的,但编译器不知道。)
apache commons-collections4:
CollectionUtils.emptyIfNull(list).stream()
爪哇 8:
Optional.ofNullable(list)
.orElseGet(Collections::emptyList)
.stream()
爪哇 9:
Stream.ofNullable(collection)
.flatMap(Collection::stream)
Apache Commons Collections 4:
import org.apache.commons.collections4.CollectionUtils;
CollectionUtils.emptyIfNull(collection)
.stream()
我个人认为 null 已弃用并尽可能使用 Optional 尽管(微小的)性能开销。 所以我使用 Stuart Marks 的接口和基于 gdejohn 的实现,即
@SuppressWarnings("unchecked")
static <T> Stream<T> nullableCollectionToStream(Collection<? extends T> coll)
{
return (Stream<T>) Optional.ofNullable(coll)
.map(Collection::stream)
.orElseGet(Stream::empty);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.