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パイプラインの処理の流れは以下のようになっています。
処理は丸数字の順に行われます。
つまり、すべての要素が一度に処理されるわけではなく、一つずつ取り出され逐次に処理されます。
なので、「2」が一つ目のfilterを通ったあとに一つ目のpeekで出力、二つ目のfilterを通ったあとに二つ目のpeekで出力、「4」が一つ目のfilterを通ったあとに一つ目のpeekで出力という順になります。
また、Streamは終端処理が実行されるまで処理は実行されません。
このコードにおける終端処理はcountメソッドなので、countの前にあるsysoutが先に実行されます。
そのため、数字が出力される前に「--------------」が出力されます。