有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

for循环如何使用Java8流迭代x次?

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

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

如果没有^{,我如何使用新的Java8流API来实现这一点

此外,流的使用将使切换到并行流变得容易如何切换到并行流

*我想保留对i的引用


共 (2) 个答案

  1. # 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. # 2 楼答案

    您可以使用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