PR

 たとえば、intの配列の平均をパラレルストリームで算出する場合を考えてみましょう。

リスト2 パラレルストリームへの変換

        int[] numbers = ...;

        OptionalDouble average =  Arrays.stream(numbers)
                                        .parallel()
                                        .average();

 Arraysクラスのstreamメソッドでストリームを生成して後に、赤字で示したparallelメソッドで変換を行っています。

 また、ストリームのファクトリーメソッドでもパラレルストリームは直接生成できないため、parallelメソッドで変換を行います。

リスト3 パラレルストリームへの変換

        int total = IntStream.range(0, 1_000_000)
                             .parallel()
                             .sum();

 あまり使う場面はないのですが、パラレルストリームから通常のストリームに変換するためのsequentialメソッドも提供されています。

順序

 パラレルストリームでは、通常のストリームとは異なり、処理順がストリームの先頭から行われるとは限りません。

 たとえば、リスト4に示した偶数を出力するコードを実行してみましょう。

リスト4 偶数の出力

        IntStream.range(0, 10)
                 .parallel()
                 .filter(x -> x%2 == 0)
                 .forEach(System.out::println);

 実行させてみればすぐに分かりますが、出力される順番が0 2 4 6 8にはなりません。また、実行ごとに順番が異なります。

 この場合、forEachメソッドの代わりにforEachOrderedメソッドを使用すると、順序通りに出力されます。