コレクションからのJava Null-Safeストリーム
1概要
このチュートリアルでは、Javaコレクションからnull-safeストリームを作成する方法を説明します。
まず、この資料を完全に理解するには、Java 8のMethod Reference、Lambda Expressions、
Optional
、およびStream APIに関するある程度の知識が必要です。
これらのトピックに不慣れな方は、まず以前の記事をご覧ください。
Java 8の新機能
、https://www.baeldung.com/java-optional[Guide to Java 8 Optional]、およびhttps://www.baeldung.com/java-8-streams-introduction[Java 8 Streamsの紹介]。
2 Mavenの依存関係
始める前に、特定のシナリオで必要となるMavenの依存関係が1つあります。
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.2</version>
</dependency>
search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.apache.commons%22%20AND%20a%3A%22commons-collections4%22[commons-collections4]
ライブラリMaven Centralからダウンロードできます。
3コレクションからストリームを作成する
任意のタイプの
Collection
からhttps://www.baeldung.com/java-8-streams-introdu[[
Stream
]を作成するための基本的な方法は、コレクションの
stream()
または
parallelStream()
メソッドを呼び出す方法です必要なストリームの種類
Collection<String> collection = Arrays.asList("a", "b", "c");
Stream<String> streamOfCollection = collection.stream();
私たちのコレクションはある時点で外部ソースを持つ可能性が高いでしょう。コレクションからストリームを作成するときは、おそらく以下のような方法になるでしょう。
public Stream<String> collectionAsStream(Collection<String> collection) {
return collection.stream();
}
これはいくつかの問題を引き起こす可能性があります。提供されたコレクションが
null
参照を指すと、コードは実行時に
NullPointerException
をスローします。
次のセクションでは、これを防ぐ方法について説明します。
4作成されたコレクションストリームをNULLセーフにする
4.1.
Null
の間接参照を防ぐためのチェックを追加
意図しない
null
ポインタ例外を防ぐために、** コレクションからストリームを作成するときに
null
参照を防ぐためのチェックを追加することを選ぶことができます。
Stream<String> collectionAsStream(Collection<String> collection) {
return collection == null
? Stream.empty()
: collection.stream();
}
しかし、この方法にはいくつかの問題があります。
まず、
null
チェックがビジネスロジックの邪魔になり、プログラム全体の読みやすさが低下します。
次に、値の欠如を表すために
null
を使用することは、Java SE 8以降では間違ったアプローチと見なされます。値の欠如と存在をモデル化するためのより良い方法があります。
空の
Collection
が
null
Collection
と同じではないことに注意してください。 1つ目は、クエリに表示する結果や要素がないことを示していますが、2つ目は、処理中にエラーが発生したことを示しています。
4.2.
CollectionUtils
ライブラリから
emptyIfNull
メソッドを使用する
私たちは、Apache Commonsのhttps://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/CollectionUtils.html[
CollectionUtils
]ライブラリを使用して、ストリームが安全であることを確認できます。このライブラリは、
null
コレクションを引数として与えられた不変の空のコレクションを返す
emptyIfNull
メソッドを提供します。それ以外の場合はコレクション自体を提供します。
public Stream<String> collectionAsStream(Collection<String> collection) {
return emptyIfNull(collection).stream();
}
これは採用するのが非常に簡単な戦略です。ただし、それは外部ライブラリに依存します。ソフトウェア開発方針によってそのようなライブラリの使用が制限されている場合、この解決策は
null
および無効になります。
4.3. Java 8の
Optional
を使う
Java SE 8のhttps://www.baeldung.com/java-optional[
Optional
]は、値を含む、または含まない単一値のコンテナです。値が欠けている場合、
Optional
コンテナは空であると言われます。
Optional
を使用することは、間違いなくストリームからnull-safeコレクションを作成するための最良の全体的な戦略と考えることができます。
それをどのように使うことができるかを見てみましょう。
public Stream<String> collectionToStream(Collection<String> collection) {
return Optional.ofNullable(collection)
.map(Collection::stream)
.orElseGet(Stream::empty);
}
-
Optional.ofNullable(collection)
は、から
Optional
オブジェクトを作成します。
渡されたコレクション以下の場合、空の
Optional
オブジェクトが作成されます。
コレクションは
nullです。
map(Collection :: stream)__ ** は、に含まれる値を抽出します。
map
メソッドへの引数としての
Optional
オブジェクト
(
Collection.stream()
)
orElseGet(Stream :: empty)
** は、イベント内の代替値を返します
Optional
オブジェクトが空、つまり渡されたコレクションが
null
であること。
その結果、意図しない
null
ポインタ例外からコードを積極的に保護します。
4.4. Java 9の
Stream
OfNullable
を使う
セクション4.1で前の三項の例を調べてください。また、
Collection
ではなく
null
になる可能性がある要素を考慮して、
Stream
クラスに
ofNullable
メソッドを追加しました。
上記のサンプルを次のように変換できます。
Stream<String> collectionAsStream(Collection<String> collection) {
return collection.stream().flatMap(s -> Stream.ofNullable(s));
}
5結論
この記事では、特定のコレクションからストリームを作成する方法について簡単に説明しました。次に、作成したストリームがコレクションから作成されたときにnull-safeであることを確認するための3つの重要な戦略について調べました。
最後に、適切な場合に各戦略を使用することの弱点を指摘しました。
いつものように、この記事に付随する完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[GitHubで利用可能]です。