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で利用可能]です。