【问题标题】:How to iterate x times using Java 8 stream? [duplicate]如何使用 Java 8 流迭代 x 次? [复制]
【发布时间】:2016-11-13 12:26:06
【问题描述】:

我有一个老式的for 循环来做一些负载测试:

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

如何在没有for 的情况下使用新的 Java 8 流 API 来执行此操作?

此外,流的使用可以很容易地切换到并行流。 如何切换到并行流?

* 我想保留对i 的引用。

【问题讨论】:

  • 如果i 是原语,“我想保留对 i 的引用。” 这句话是什么意思?
  • 无论条件如何,测试都在运行吗?
  • 试试这个IntStream.range(0, 1000).filter(i-&gt;((i+1)%100 ==0)).forEach(i-&gt;System.out.printf("Test number %d started.%n", i));
  • 从当前代码来看,测试是针对所有 i 值运行的,而不是每 100 个值。这是故意的吗?是否要使用预定义的步骤迭代索引,如stackoverflow.com/questions/32586604/… 所示?
  • 我只想通知每 100 个处理元素的进度。我应该按时完成,但我认为为时已晚。答案将其作为问题的一部分。

标签: java for-loop java-8 java-stream


【解决方案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(seed, condition, unaryOperator),它非常适合您的情况,旨在使流变得有限,并可能取代普通的 for

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

【讨论】:

    【解决方案2】:

    您可以使用IntStream,如下所示并在 cmets 中进行了说明:

    (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
    

    【讨论】:

    • 这似乎错过了The test itself,但也许我在这里遗漏了一些东西......
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多