今まで扱ってきたストリームはすべてシーケンシャルに処理を行うストリームでした。
しかし、本連載の第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メソッドが提供されています。