コレクションからの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で利用可能]です。