Project Lambdaが策定された大きな理由としてパラレル処理があるのは、本連載の「Java SE 8、Stream APIの基本を理解する」で述べた通りです。
ストリームでパラレル処理を行うには、パラレル処理用のストリームを使用します。しかし、パラレル処理用のストリームの型はjava.util.stream.Streamインタフェースなどで、シーケンシャルなストリームと変わりません。
つまり、パラレルストリームさえ準備できれば、今まで説明してきたストリームと同じように使うことができるのです。もちろん、パラレル処理なので、全てがシーケンシャルな処理と同じというわけにはいきません。
そこで、今回はパラレルストリームの生成や基本的な使い方から、パラレルストリームを使う上での注意点まで説明していきます。
パラレルストリームの生成
パラレルストリームの生成には2種類の方法があります。一方がソースから直接パラレルストリームを生成する方法、もう一方がシーケンシャルなストリームからパラレルストリームを生成する方法です。
双方を順に説明していきましょう。
ソースからパラレルストリームを生成
ソースの型がjava.util.Collectionインタフェースであれば、ソースからパラレルストリームを生成できます。
Collectionインタフェースでシーケンシャルストリームを生成するにはstreamメソッドを使用しましたが、パラレルストリームを生成するにはparallelStreamメソッドを使用します。
リスト1●コレクションからパラレルストリームを生成
List<String> list = ……;
// パラレルストリームを生成
Stream<String> parallelStream = list.parallelStream();
リスト1ではCollectionインタフェースのサブインタフェースであるjava.util.Listインタフェースのオブジェクトから、赤字で示したparallelStreamメソッドを使用してパラレルストリームを生成しています。
前述したように、パラレルストリームといってもシーケンシャルなストリームと型は同じです。リスト1でもparallelStreamメソッドで生成したパラレルストリームの型はStreamインタフェースになっています。
StreamインタフェースにはパラレルストリームであるかどうかをチェックするisParallelメソッドも定義されています。しかし、ストリームはメソッドチェーンで使用することが多いため、isParallelメソッドを使用できる場面は少ないはずです。
コードを記述する時に、パラレルなのかシーケンシャルなのかよく注意して記述するようにしましょう。