在 Java 8 中将 Null 安全集合作为流

2022-08-31 13:44:16

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

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

我创建了自己的方法:

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

但我很好奇,标准JDK中是否有这样的东西?


答案 1

您可以使用 :Optional

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

我任意选择作为默认值,以防万一为空。这将导致方法调用生成空 if 为 null。Collections.emptySet()collectionstream()Streamcollection

例:

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 ())...

答案 2

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

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