it-roy-ru.com

Как повторить x раз, используя поток Java 8?

У меня есть цикл for старого стиля для некоторых нагрузочных тестов:

For (int i = 0 ; i < 1000 ; ++i) {
  if (i+1 % 100 == 0) {
    System.out.println("Test number "+i+" started.");
  }
  // The test itself...
}

Как я могу использовать новый потоковый API Java 8, чтобы иметь возможность делать это без for?

Кроме того, использование потока позволит легко переключаться на параллельный поток. Как перейти на параллельный поток?

* Я хотел бы сохранить ссылку на i.

5
AlikElzin-kilaka
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 out):

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 есть удивительный перегруженный метод Stream.iterate(seed, condition, unaryOperator), который идеально подходит для вашей ситуации и предназначен для того, чтобы сделать поток конечным и может заменить обычный for:

Stream<Integer> stream = Stream.iterate(0, i -> i < 1000, i -> i + 100);
12
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
1
developer