繁体   English   中英

如何最好地从可为空对象创建 Java 8 流?

[英]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

我能想到的最好的事情是将OptionalorElseGet方法一起使用。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM