talosのプログラミング教室

Java Gold合格への道 ~StreamAPI・Streamパイプラインの処理の流れ~

スポンサーリンク

こんにちは。たろすです。

今回はStreamパイプラインの処理の流れについて説明します。

処理の流れを可視化

次のプログラムはどのような出力をすると思いますか?

int[] array = { 1, 2, 3, 4, 5 };
IntStream stream = Arrays.stream(array)
				.filter(n -> n % 2 == 0)
				.peek(System.out::println)
				.filter(n -> n <= 3)
				.peek(System.out::println);
System.out.println("--------------");
stream.count();


答えはこのようになります。

--------------
2
2
4

ちょっと意外に思った方もいるのではないでしょうか。

このような順番で出力されたのにはちゃんと理由があります。


Streamパイプラインの処理の流れは以下のようになっています。

f:id:talosta:20220108120415p:plain

処理は丸数字の順に行われます。

つまり、すべての要素が一度に処理されるわけではなく、一つずつ取り出され逐次に処理されます。

なので、「2」が一つ目のfilterを通ったあとに一つ目のpeekで出力、二つ目のfilterを通ったあとに二つ目のpeekで出力、「4」が一つ目のfilterを通ったあとに一つ目のpeekで出力という順になります。


また、Streamは終端処理が実行されるまで処理は実行されません。

このコードにおける終端処理はcountメソッドなので、countの前にあるsysoutが先に実行されます。

そのため、数字が出力される前に「--------------」が出力されます。

おわりに

今回はStreamパイプラインの処理の流れについて説明しました。