我正在寻找可以使收集流,但是是安全的方法.如果collection为null,则返回空流.像这样:
Utils.nullSafeStream(collection).filter(...);
我创建了自己的方法:
public staticStream nullSafeStream(Collection collection) { if (collection == null) { return Stream.empty(); } return collection.stream(); }
但我很好奇,如果标准JDK中有这样的东西?
你可以使用Optional
:
Optional.ofNullable(collection).orElse(Collections.emptySet()).stream()...
我选择Collections.emptySet()
任意作为默认值,如果collection
是null.这将导致stream()
方法调用生成为空,Stream
如果collection
为null.
示例:
Collectioncollection = 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 staticStream collectionAsStream(Collection 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)
您可以使用类似这样的内容:
public static void main(String [] args) { ListsomeList = new ArrayList<>(); asStream(someList).forEach(System.out::println); } public static Stream asStream(final Collection collection) { return Optional.ofNullable(collection) .map(Collection::stream) .orElseGet(Stream::empty); }
如果org.apache.commons.collections4
无法下载该库,则可以编写自己的包装器/便捷方法。
public staticStream asStream(final Collection collection) { return collection == null ? ( Stream ) Collections.emptyList().stream() : collection.stream(); }
或用 Optional.ofNullable
public staticStream asStream(final Collection collection) { return Optional.ofNullable(collection) .orElse( Collections.emptySet()).stream(); }