web-dev-qa-db-ja.com

Java 8ストリームを使用してx回反復するには?

負荷テストを行うための古いスタイルの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への参照を保持したいと思います。

9
_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);
_
18
Andrew Tobilko

以下に示され、コメントで説明されているように、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
2
developer