按步骤循环访问 IntStream

2022-09-02 11:21:53

如何使用 IntStream 在步骤 (3) 中循环访问一系列数字 (0-100)?

我试过了,但这永远不会停止执行。iterate

IntStream.iterate(0, n -> n + 3).filter(x -> x > 0 && x < 100).forEach(System.out::println)

答案 1

实际上,这是理想的选择。range

IntStream.range(0, 100).filter(x -> x % 3 == 0); //107,566 ns/op [Average]

编辑:Holgers的解决方案是执行速度最快的解决方案。

由于以下代码行

IntStream.range(0, 100).filter(x -> x % 3 == 0).forEach((x) -> x = x + 2); 

IntStream.range(0, 100 / 3).map(x -> x * 3).forEach((x) -> x = x + 2); 

int limit = ( 100 / 3 ) + 1; 
IntStream.iterate(0, n -> n + 3).limit(limit).forEach((x) -> x = x + 2);

显示这些基准测试结果

Benchmark                 Mode  Cnt    Score    Error  Units
Benchmark.intStreamTest   avgt    5  485,473 ± 58,402  ns/op
Benchmark.intStreamTest2  avgt    5  202,135 ±  7,237  ns/op
Benchmark.intStreamTest3  avgt    5  280,307 ± 41,772  ns/op

答案 2

实际上,您还可以通过查看和allMatch的组合获得相同的结果:

IntStream.iterate(0, n -> n + 3).peek(n -> System.out.printf("%d,", n)).allMatch(n -> n < 100 - 3);

这打印

0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99,

但尽管如此,这个更快:

IntStream.range(0, 100 / 3 + 1).map(x -> x * 3).forEach((x) -> System.out.printf("%d,", x));

Java 9 更新:

现在,使用 Java 9 更容易实现相同的迭代:

Stream.iterate(0, i -> i <= 100, i -> 3 + i).forEach(i -> System.out.printf("%d,", i));