1前書き

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

簡単に言うと、このAPIを使用すると、宣言型APIを提供することで、コレクションやその他の一連の要素(

便利かつ効率的

)を処理できます。


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

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

幸いなことに、最も使われている3つのプリミティブ型

int、long

、および

double

を扱う方法を提供するために、標準ライブラリには3つのプリミティブに特化した実装、

IntStream



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

を作成するもう1つの方法は、

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()

メソッドを呼び出して整数値の平均を取得します。見てのとおり、

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ループの派手な形としてrangeを使うことができます。

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

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

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

これらの派手なループと同じくらい便利なのは、単純さ、読みやすさ、そしてパフォーマンスのために、機能的なループの代わりに従来の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は、この言語に非常に強力な追加機能です。ここではプリミティブストリームの表面をほとんど傷つけていませんが、あなたは既にそれらを生産的にするために使うことができます。

そして、いつものように、コードサンプルはhttps://github.com/eugenp/tutorials/tree/master/java-streams[GitHubについて]で見つけることができます。