もっと Lambda その18
昨日のエントリーの解答を載せておきます。
10
8
0
4
2
6
上記のように 0 から 10 までの偶数が表示されます。
出力される順番はプログラムが実行される環境により変わります。
これは parallel() メソッドにより平行ストリームとして処理されるからです。
JavaDOC では下記のようになってます。
public IntStream parallel()
Returns an equivalent stream that is parallel. May return itself, either because the stream was already parallel, or because the underlying stream state was modified to be parallel.
This is an intermediate operation.
戻り値:
a parallel stream
それでは順序よく 0 から 10 までの偶数を表示させるにはどうすればいいでしょうか?
そんな我が儘なあなたに使って欲しいメソッドが用意されてます。
public void forEachOrdered(IntConsumer action)
Performs an action for each element of this stream, guaranteeing that each element is processed in encounter order for streams that have a defined encounter order.
This is a terminal operation.
パラメータ:
action
– a non-interfering action to perform on the elements
参照:
これを使って昨日のプログラムを変更してみます。
ついでにメソッドリファレンスを使うように変更しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package jp.yucchi.tryforeachordered; import java.util.stream.IntStream; public class TryforEachOrdered { public static void main(String[] args) { IntStream.rangeClosed(0, 10).parallel() .filter(e -> (e & 1) == 0) .forEachOrdered(System.out::println); } } |
実行結果は期待通りに順序よく出力されます。
0
2
4
6
8
10
検証はしてないのですがコストが高くなるようなので使いどころを誤らないようにしなければいけないようです。
簡単なパズルでしたけどなんでもいいから平行ストリーム使っちゃえ!ってやってたらはまる可能性がありますね。(私のような単純で純粋なひとはw)
TAGS: Java | 2013年6月19日3:34 AM
Trackback URL