空安全集合作为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 ())...
35 votes
您可以使用org.apache.commons.collections4.CollectionUtils :: emptyIfNull函数:
org.apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
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
所需的内容似乎仅在需要返回流(包括进行平面映射)或将其与另一个连接时才有用。
6 votes
不确定是否有帮助,但是从Java 9开始,您可以编写:
Stream.ofNullable(nullableCollection)
.flatMap(Collection::stream)
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();
}
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);
}