空安全集合作为Java 8中的流

我正在寻找可以收集流的方法,但是它是无效的。 如果collection为null,则返回空流。 像这样:

Utils.nullSafeStream(collection).filter(...);

我创建了自己的方法:

public static <T> Stream<T> nullSafeStream(Collection<T> collection) {
    if (collection == null) {
        return Stream.empty();
    }
    return collection.stream();
}

但是我很好奇,如果标准的JDK中有类似的东西?

Gondy asked 2020-08-12T05:58:24Z
6个解决方案
74 votes

您可以使用Optional

Optional.ofNullable(collection).orElse(Collections.emptySet()).stream()...

collection为空的情况下,我任意选择Collections.emptySet()作为默认值。 如果collection为空,这将导致stream()方法调用产生一个空的Stream

范例:

Collection<Integer> collection = Arrays.asList (1,2,3);
System.out.println (Optional.ofNullable(collection).orElse(Collections.emptySet()).stream().count ());
collection = null;
System.out.println (Optional.ofNullable(collection).orElse(Collections.emptySet()).stream().count ());

输出:

3
0

或者,按照marstran的建议,您可以使用:

Optional.ofNullable(collection).map(Collection::stream).orElse(Stream.empty ())...
Eran answered 2020-08-12T05:59:10Z
35 votes

您可以使用org.apache.commons.collections4.CollectionUtils :: emptyIfNull函数:

  org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
greg answered 2020-08-12T05:58:32Z
8 votes

您的collectionAsStream()方法可以简化为比使用300772308172616606017时更简单的版本:

public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
    return collection == null ? Stream.empty() : collection.stream();
}

请注意,在大多数情况下,在构建流管道之前最好测试一下是否为空:

if (collection != null) {
    collection.stream().filter(...)
} // else do nothing

所需的内容似乎仅在需要返回流(包括进行平面映射)或将其与另一个连接时才有用。

Didier L answered 2020-08-12T05:59:39Z
6 votes

不确定是否有帮助,但是从Java 9开始,您可以编写:

Stream.ofNullable(nullableCollection)
      .flatMap(Collection::stream)
fhiegel answered 2020-08-12T06:00:01Z
5 votes

如果无法下载库3007723934092622624896,则可以编写自己的包装器/便捷方法。

public static <T> Stream<T> asStream(final Collection<T> collection) {
    return collection == null ? ( Stream<T> ) Collections.emptyList().stream() 
                              : collection.stream();
}

或用3007723934092622624896包装收藏

public static <T> Stream<T> asStream(final Collection<T> collection) {
    return Optional.ofNullable(collection)
            .orElse( Collections.emptySet()).stream();
}
alltej answered 2020-08-12T06:00:26Z
5 votes

您可以使用类似的方法:

public static void main(String [] args) {
    List<String> someList = new ArrayList<>();
    asStream(someList).forEach(System.out::println);
}

public static <T> Stream<T> asStream(final Collection<T> collection) {
    return Optional.ofNullable(collection)
            .map(Collection::stream)
            .orElseGet(Stream::empty);
}
g-t answered 2020-08-12T06:00:46Z
translate from https://stackoverflow.com:/questions/41590134/null-safe-collection-as-stream-in-java-8