用 Null 安全集合作为 Java8中的 Stream

我正在寻找的方法,可以使收集流,但是空安全。如果集合为空,则返回空流。像这样:

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

我创造了我自己的方法:

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

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

114381 次浏览

你可以使用 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

或者,就像马斯特兰建议的那样,你可以使用:

Optional.ofNullable(collection).map(Collection::stream).orElse(Stream.empty ())...

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

import static org.apache.commons.collections4.CollectionUtils.emptyIfNull;
      

emptyIfNull(list).stream()
.filter(...);

你可以使用这样的东西:

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

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

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

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

如果不能下载库 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();
}

不知道是否有帮助,但是 从 Java 9开始,你可以这样写:

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