IntStream逐步迭代

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

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

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

实际上你也可以通过peek和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)); 

在JDK9中,需要注意的takeWhile 1

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

实际上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 

limit也可以使用

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

如果您可以添加库依赖项, Eclipse Collections中的IntInterval类具有我认为您正在寻找的步骤函数。 我尝试了一些将IntInterval转换为IntInterval不同方法,因为原始问题要求IntStream 。 以下是我使用IntInterval然后将其转换为IntStream的解决方案。

 IntInterval interval = IntInterval.zeroTo(99).by(3); interval.each(System.out::print); IntStream.of(interval.toArray()).forEach(System.out::print); IntStream.Builder builder = IntStream.builder(); interval.each(builder::add); builder.build().forEach(System.out::print); IntStream.generate(interval.intIterator()::next) .limit(interval.size()).forEach(System.out::print); 

IntInterval包含from和to IntStream.rangeClosed()

注意:我是Eclipse Collections的提交者

优雅解决方案

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

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