Java 8におけるプリミティブ型ストリーム

Java 8のプリミティブ型ストリーム

1. 前書き

Stream APIは、Java 8で追加された重要な機能の1つでした。

簡単に言うと、APIを使用すると、宣言型APIを提供することで、コレクションやその他の要素のシーケンス(conveniently and more efficiently)を処理​​できます。

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

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

幸い、最もよく使用される3つのプリミティブ型(int, longdouble)を操作する方法を提供するために、標準ライブラリには、IntStreamLongStream,、およびDoubleStream

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

3. 算術演算

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

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()メソッドを呼び出すだけです。結果はすでにint値として返されるため、getAsInt()を使用する必要はありません。

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

average()メソッドを呼び出して整数値の平均を取得します。ご覧のとおり、double型の値を返すため、getAsDouble()を使用する必要があります。

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()には包括的であるということです。

範囲メソッドは、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 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は、言語への非常に強力な追加機能です。 ここでは、プリミティブストリームの表面をほとんど傷つけていませんが、すでにそれらを使用して生産性を高めることができます。

そして、いつものように、コードサンプルはover on GitHubで見つけることができます。