1. 概要

この簡単な記事では、Java9で提供される新しい興味深いStreamAPIの改善に焦点を当てます。

2. Takewhile/Dropwhileをストリーミング

これらのメソッドに関する議論は、 StackOverflow で繰り返し登場しています(最も人気のあるのはこれです)。

この[の現在の値の長さまで、前の Stream の値に1文字を追加して、StringStreamを生成するとします。 X181X]Streamが10よりも低くなっています。

Java 8でどのように解決しますか? limit allMatch のような短絡中間操作のいずれかを使用して、実際に他の目的に使用したり、に基づいて独自のtakeWhile実装を記述したりできます。 ] Spliterator は、このような単純な問題を複雑にします。

Java 9を使用すると、解決策は簡単です。

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

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

先に進むには、「最長のプレフィックス」と「ストリームのサブセット」という用語の意味をよりよく理解する必要があります。

  • 最長のプレフィックスは、指定された述語に一致するストリームの要素の連続したシーケンスです。 シーケンスの最初の要素はこのストリームの最初の要素であり、シーケンスの最後の要素の直後の要素は指定された述語と一致しません
  • ストリームのサブセットは、指定された述語に一致するストリームのいくつかの(すべてではない)要素のセットです。

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

takeWhileとは正反対です。 ストリームが順序付けられている場合、 dropWile は、指定された述語に一致する要素の最長のプレフィックスをドロップした後、この Streamの残りの要素で構成されるストリームを返します。

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

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

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

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

3. ストリームの反復

次の新機能は、有限ストリーム生成のためのオーバーロードされた反復メソッドです。 ある関数によって生成された無限の順次順序付けされた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. StreamOfnullable

要素をStreamに配置する必要がある場合があります。 時々、この要素は null かもしれませんが、Stream にそのような値を含めたくありません。 これは、 if ステートメント、または要素がnullであるかどうかをチェックする3項演算子のいずれかを記述します。

コレクションおよびマップ変数が正常に作成および入力されたと仮定して、次の例を見てください。

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. 結論

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

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