Java 9 Stream APIの改善

Java 9 Stream APIの改善

1. 概要

この簡単な記事では、Java 9で導入される新しい興味深いStream APIの改善に焦点を当てます。

2. Takewhile / Dropwhileのストリーム

これらの方法に関する議論は、StackOverflowで繰り返し登場しています(最も一般的なのはthis oneです)。

このStreamの現在の値の長さが以下になるまで、前のStreamの値に1文字を追加して、StringsのStreamを生成するとします。 10

Java 8ではどのように解決しますか? limitallMatchのような短絡中間演算のいずれかを使用して、実際に他の目的に使用したり、Spliteratorに基づいて独自のtakeWhile implementationを記述したりすることができます。 、そのような単純な問題を複雑にします。

Java 9では、ソリューションは簡単です。

Stream stream = Stream.iterate("", s -> s + "s")
  .takeWhile(s -> s.length() < 10);

takeWhile操作はPredicateを取り、要素に適用されて、これらの要素の最長プレフィックス(ストリームが順序付けられている場合)またはストリームの要素のサブセット(ストリームが順序付けられていない場合)を決定します。

先に進むには、「最長のプレフィックス」と「Stream’sサブセット」の意味を理解する必要があります。

  • the longest prefixは、指定された述語に一致するストリームの要素の連続シーケンスです。 シーケンスの最初の要素はこのストリームの最初の要素であり、シーケンスの最後の要素の直後にある要素は指定された述語と一致しません

  • a Stream’s subsetは、指定された述語に一致するStreamの一部(すべてではない)要素のセットです。

これらの重要な用語を紹介した後、別の新しいdropWhile操作を簡単に理解できます。

takeWhileとは正反対です。 ストリームが順序付けられている場合、dropWileは、指定された述語に一致する要素のこのStreamafter dropping the longest prefixの残りの要素で構成されるストリームを返します。

それ以外の場合、Streamが順序付けされていない場合、dropWileは、指定された述語に一致する要素のこのStreamafter dropping a subsetの残りの要素で構成されるストリームを返します。

前に取得したStreamを使用して、最初の5つの要素を破棄しましょう。

stream.dropWhile(s -> !s.contains("sssss"));

簡単に言えば、dropWhile操作は要素を削除しますが、要素の指定された述語はtrueを返し、最初の述語のfalseで削除を停止します。

3. ストリームの反復

次の新機能はthe overloaded iterate method for finite Streams generationです。 ある関数によって生成された無限の順次順序付けされたStreamを返すfiniteバリアントと混同しないでください。

新しいiterateは、要素に適用される述語を追加してこのメ​​ソッドをわずかに変更し、ストリームをいつ終了する必要があるかを決定します。 その使用法は非常に便利で簡潔です:

Stream.iterate(0, i -> i < 10, i -> i + 1)
  .forEach(System.out::println);

対応するforステートメントに関連付けることができます。

for (int i = 0; i < 10; ++i) {
    System.out.println(i);
}

4. 無効化可能なストリーム

要素をStreamに入れる必要がある状況がいくつかあります。 この要素がnullである場合もありますが、Streamにそのような値が含まれることは望ましくありません。 これにより、ifステートメント、または要素がnull.であるかどうかをチェックする三項演算子が記述されます。

collection変数とmap変数が正常に作成および入力されたと仮定して、次の例を見てください。

collection.stream()
  .flatMap(s -> {
      Integer temp = map.get(s);
      return temp != null ? Stream.of(temp) : Stream.empty();
  })
  .collect(Collectors.toList());

このような定型コードを回避するために、ofNullableメソッドがStreamクラスに追加されました。 このメソッドを使用すると、前述のサンプルは次のように簡単に変換できます。

collection.stream()
  .flatMap(s -> Stream.ofNullable(map.get(s)))
  .collect(Collectors.toList());

5. 結論

Java 9のStream APIの大きな変更と、これらの改善がより少ない労力でより強調されたプログラムを作成するのにどのように役立つかを検討しました。

いつものように、コードスニペットはover on Githubにあります。