1. 序章

Stream APIは、Java8で追加された主要な機能の1つでした。

簡単に言うと、APIを使用すると、宣言型APIを提供することで、コレクションやその他の要素のシーケンスを便利かつ効率的に処理できます。

2. プリミティブストリーム

ストリームは主にオブジェクトのコレクションで機能し、プリミティブタイプでは機能しません。

幸い、最もよく使用される3つのプリミティブ型( int、long double )を操作する方法を提供するために、標準ライブラリには3つのプリミティブ専用実装が含まれています: IntStream [X210X ]、 LongStream、およびDoubleStream

プリミティブストリームは、主にボクシングのオーバーヘッドのために制限されており、他のプリミティブ用に特殊なストリームを作成することは多くの場合それほど有用ではないためです。

3. 算術演算

min max sum average:など、頻繁に使用される算術演算のいくつかの興味深い方法から始めましょう。

int[] integers = new int[] {20, 98, 12, 7, 35};
int min = Arrays.stream(integers)
  .min()
  .getAsInt(); // returns 7

何が起こっているのかを理解するために、上記のコードスニペットをステップスルーしてみましょう。

java.util.Arrays.stream(int [])を使用して IntStream を作成し、 min()メソッドを使用して最小の整数を取得しました。 java.util.OptionalInt そして最後にgetAsInt()を呼び出して、int値を取得します。

IntStream を作成する別の方法は、 IntStream.of(int…)を使用することです。 max()メソッドは、最大の整数を返します。

int max = IntStream.of(20, 98, 12, 7, 35)
  .max()
  .getAsInt(); // returns 98

次に–整数の合計を取得するには、 sum()メソッドを呼び出すだけで、 getAsInt()を使用する必要はありません。これは、結果がとして既に返されるためです。 int 値:

int sum = IntStream.of(20, 98, 12, 7, 35).sum(); // returns 172

average()メソッドを呼び出して整数値の平均を取得します。ご覧のとおり、 getAsDouble()を使用すると、double[タイプの値が返されます。 X173X]。

double avg = IntStream.of(20, 98, 12, 7, 35)
  .average()
  .getAsDouble(); // returns 34.4

4. 範囲

範囲に基づいてIntStreamを作成することもできます。

int sum = IntStream.range(1, 10)
  .sum(); // returns 45
int sum = IntStream.rangeClosed(1, 10)
  .sum(); // returns 55

上記のコードスニペットが示すように、整数値の範囲 range() rangeClosed()を作成する2つの方法があります。

違いは、 range()の終わりは排他的ですが、 rangeClosed()には包括的であるということです。

Rangeメソッドは、IntStreamおよびLongStreamでのみ使用できます。

範囲は、for-eachループのファンシーな形式として使用できます。

IntStream.rangeClosed(1, 5)
  .forEach(System.out::println);

それらをfor-eachループの置換として使用するのが得意なのは、並列実行も利用できることです。

IntStream.rangeClosed(1, 5)
  .parallel()
  .forEach(System.out::println);

これらの派手なループと同様に、単純さ、読みやすさ、場合によってはパフォーマンスのために、単純な反復には機能的なforループの代わりに従来のforループを使用する方がよい場合があります。

5. ボクシングとアンボクシング

プリミティブ値を同等のラッパーに変換する必要がある場合があります。

そのような場合、 boxed()メソッドを使用できます。

List<Integer> evenInts = IntStream.rangeClosed(1, 10)
  .filter(i -> i % 2 == 0)
  .boxed()
  .collect(Collectors.toList());

ラッパークラスストリームからプリミティブストリームに変換することもできます。

// returns 78
int sum = Arrays.asList(33,45)
  .stream()
  .mapToInt(i -> i)
  .sum();

プリミティブストリームを作成するには、いつでもmapToXxxおよびflatMapToXxxメソッドを使用できます。

6. 結論

Java Streamsは、この言語への非常に強力な追加機能です。 ここでは、プリミティブストリームの表面をほとんど傷つけていませんが、すでにそれらを使用して生産性を高めることができます。

そして、いつものように、コードサンプルはGitHubにあります。