如何使用 Java 8 流迭代 x 次?

2022-09-04 07:23:00

我有一个旧样式的循环来做一些负载测试: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


答案 1
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 中有一个很棒的重载方法 Stream.iterate(种子、条件、一元操作器),它完全适合您的情况,旨在使流有限,并可能取代以下简单方法:

Stream<Integer> stream = Stream.iterate(0, i -> i < 1000, i -> i + 100);

答案 2

您可以使用如下图所示,并在注释中说明:IntStream

(1) 迭代范围从 1 到 1000IntStream

(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