IntStream逐步迭代

Jas*_*erJ 10 java functional-programming java-8

如何使用IntStream在步骤(3)中迭代一系列数字(0-100)?

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

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

Jas*_*erJ 11

实际上range是理想的.

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

编辑: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);
Run Code Online (Sandbox Code Playgroud)

显示这些基准测试结果

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
Run Code Online (Sandbox Code Playgroud)

  • `IntStream.range(0,100/3).map(i - > i*3)`可能效率更高...... (5认同)
  • 那么,33次乘法*应该*比100次模运算快.但请注意,在进行基准测试时,您必须关心JIT无法将消费者优化为无操作,即如果您使用JMH,请在消费者中使用`x`调用`BlackHole.consume`. (4认同)

gil*_*des 8

实际上,结合使用peek和allMatch也可以达到相同的结果:

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

此打印

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));
Run Code Online (Sandbox Code Playgroud)

Java 9更新:

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

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

  • @leeCoder类似:`String join = IntStream.range(0, 100 / 3 + 1).map(x -&gt; x * 3).mapToObj(Integer::toString).collect(Collectors.joining(",") );` (2认同)

Sar*_*ana 6

limit也可以用

int limit = ( 100 / 3 ) + 1;
IntStream.iterate(0, n -> n + 3).limit(limit).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)


dav*_*don 5

在 JDK9 中有takeWhile 1

IntStream
  .iterate(0, n -> n + 3)
  .takeWhile(n -> n < 100)
  .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)


Sri*_*ram 5

优雅的解决方案:

IntStream.iterate(0, n -> n < 100, n -> n + 3).forEach(System.out::println)
Run Code Online (Sandbox Code Playgroud)

Stream.iterate() 支持hasNext() 谓词(在 Java 9 中添加),可用于以更自然的方式限制流。