負荷テストを行うための古いスタイルのfor
ループがあります。
For (int i = 0 ; i < 1000 ; ++i) {
if (i+1 % 100 == 0) {
System.out.println("Test number "+i+" started.");
}
// The test itself...
}
新しいJava 8ストリームAPIを使用してfor
?なしでこれを行うにはどうすればよいですか?
また、ストリームを使用すると、パラレルストリームに簡単に切り替えることができます。 パラレルストリームに切り替える方法は?
* i
への参照を保持したいと思います。
_IntStream.range(0, 1000)
/* .parallel() */
.filter(i -> i+1 % 100 == 0)
.peek(i -> System.out.println("Test number " + i + " started."))
/* other operations on the stream including a terminal one */;
_
条件に関係なく反復ごとにテストが実行されている場合(filter
を取り出す):
_IntStream.range(0, 1000)
.peek(i -> {
if (i + 1 % 100 == 0) {
System.out.println("Test number " + i + " started.");
}
}).forEach(i -> {/* the test */});
_
別のアプローチ( @ Tunaki 前述のように、事前定義されたステップでインデックスを反復処理する場合):
_IntStream.iterate(0, i -> i + 100)
.limit(1000 / 100)
.forEach(i -> { /* the test */ });
_
JDK 9には、状況に完全に適合し、ストリームを有限にするように設計され、プレーンなfor
を置き換える可能性のある、オーバーロードされた素晴らしいメソッドStream.iterate(seed, condition, unaryOperator)
があります。
_Stream<Integer> stream = Stream.iterate(0, i -> i < 1000, i -> i + 100);
_
以下に示され、コメントで説明されているように、IntStream
を使用できます。
(1)IntStream
の範囲を1から1000まで繰り返します
(2)parallel
ストリームに変換する
(3)Predicate
条件を適用して、(i+1)%100 == 0
の整数を許可します
(4)整数を文字列"Test number "+i+" started."
に変換します
(5)コンソールへの出力
IntStream.range(1, 1000). //iterates 1 to 1000
parallel().//converts to parallel stream
filter( i -> ((i+1)%100 == 0)). //filters numbers & allows like 99, 199, etc..)
mapToObj((int i) -> "Test number "+i+" started.").//maps integer to String
forEach(System.out::println);//prints to the console