コレクションのストリームを作成できるメソッドを探していますが、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にこのようなものがある場合、私は興味がありますか?
Org.Apache.commons.collections4.CollectionUtils :: emptyIfNull関数を使用できます。
org.Apache.commons.collections4.CollectionUtils.emptyIfNull(list).stream().filter(...);
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 ())...
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
必要なのは、ストリームを返す必要がある場合(フラットマッピングを含む)、または別のストリームと連結する必要がある場合のみです。
役立つかどうかはわかりませんが、Java 9なので、次のように書くことができます。
Stream.ofNullable(nullableCollection)
.flatMap(Collection::stream)
ライブラリ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();
}
次のようなものを使用できます。
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);
}