web-dev-qa-db-ja.com

Java 8のストリームとしてのNullセーフコレクション

コレクションのストリームを作成できるメソッドを探していますが、nullセーフです。コレクションがnullの場合、空のストリームが返されます。このような:

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

私は独自のメソッドを作成しました:

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

しかし、標準のJDKにこのようなものがある場合、私は興味がありますか?

41
Gondy

Org.Apache.commons.collections4.CollectionUtils :: emptyIfNull関数を使用できます。

  org.Apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
35
greg

Optionalを使用できます:

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

collectionがnullの場合、Collections.emptySet()をデフォルト値として任意に選択しました。これにより、Streamがnullの場合、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

または、marstranが示唆したように、次を使用できます。

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

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

必要なのは、ストリームを返す必要がある場合(フラットマッピングを含む)、または別のストリームと連結する必要がある場合のみです。

8
Didier L

役立つかどうかはわかりませんが、Java 9なので、次のように書くことができます。

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

ライブラリ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();
}
5
alltej

次のようなものを使用できます。

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);
}
4
g-t