今まで扱ってきたストリームはすべてシーケンシャルに処理を行うストリームでした。

 しかし、本連載の第2回で記述したように、Project Lambdaの導入理由はパラレル処理にあります。そこで、今月は満を持してパラレルストリームについて紹介していきます。

 パラレル処理といっても、パラレルストリームの場合、いくつかの約束を守っていればそれほど難しいことはありません。

 早速、試してみましょう。

パラレルストリームの生成

 パラレルストリームといっても、パラレルストリーム用のインタフェースがあるわけではありません。今まで通り、StreamインタフェースもしくはIntStreamインタフェースなどを使用します。

 異なるのは、ストリームを生成するためのメソッドです。

 コレクションからストリームを生成する場合、シーケンシャルなストリームであればstreamメソッドを使用してきました。パラレルストリームの場合、streamメソッドの代わりにparallelStreamメソッドを使用します。

 たとえば、文字列のリストにおいて、"a"で始まる文字列の数を数えるには、リスト1のように記述します。

リスト1 パラレルストリームの例

        List<String> texts = ...;
        
        long result = texts.parallelStream()
                           .map(s -> s.trim())
                           .filter(s -> s.startsWith("a"))
                           .count();

 赤字で示したようにparallelStreamメソッドでストリームを生成しています。その後は、通常のストリームと同様に処理を行います。

 ソースがコレクションではない場合、たとえば配列などは直接パラレルストリームを生成することはできません。その代わりに、通常のストリームからパラレルストリームへの変換メソッドであるparallelメソッドが提供されています。