繁体   English   中英

在Java 8中将Null安全收集为Stream

[英]Null safe Collection as Stream in 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中有这样的东西?

你可以使用Optional

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

我任意选择Collections.emptySet()作为case collection为null时的默认值。 如果collection为null,这将导致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 ())...

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

  org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);

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

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

请注意,在大多数情况下,在构建流管道之前测试nullness可能更好:

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

你想要什么似乎只在你需要返回流(包括用于平面映射),或者可能与另一个连接时才有用。

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

Stream.ofNullable(nullableCollection)
      .flatMap(Collection::stream)

如果下载库org.apache.commons.collections4不是一个选项,您可以编写自己的包装/方便方法。

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

或者使用Optional.ofNullable包装集合

public static <T> Stream<T> asStream(final Collection<T> collection) {
    return Optional.ofNullable(collection)
            .orElse( Collections.emptySet()).stream();
}

你可以使用这样的东西:

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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