我正在寻找可以进行收集流的方法,但是是null安全的。如果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中有这样的东西吗?
答案 0 :(得分:62)
您可以使用Optional
:
Optional.ofNullable(collection).orElse(Collections.emptySet()).stream()...
我Collections.emptySet()
任意选择collection
作为stream()
为空的默认值。如果Stream
为空,这将导致collection
方法调用生成空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 ())...
或者,正如marstran建议的那样,您可以使用:
{{1}}
答案 1 :(得分:34)
您可以使用org.apache.commons.collections4.CollectionUtils :: emptyIfNull函数:
org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
答案 2 :(得分:8)
您的collectionAsStream()
方法可以简化为比使用Optional
时更简单的版本:
public static <T> Stream<T> collectionAsStream(Collection<T> collection) {
return collection == null ? Stream.empty() : collection.stream();
}
请注意,在大多数情况下,在构建流管道之前测试null值可能更好:
if (collection != null) {
collection.stream().filter(...)
} // else do nothing
你想要的东西似乎只在你需要返回流时(包括用于平面映射),或者可能将它与另一个连接起来。
答案 3 :(得分:4)
如果无法下载库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();
}
答案 4 :(得分:3)
你可以使用类似的东西:
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);
}
答案 5 :(得分:3)
不确定是否有帮助,但是自Java 9起,您可以编写:
Stream.ofNullable(nullableCollection)
.flatMap(Collection::stream)