IntStream逐步迭代

时间:2016-11-01 11:06:18

标签: 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)

7 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

实际上,通过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));

答案 2 :(得分:3)

在JDK9中,有takeWhile 1

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

答案 3 :(得分:2)

childModelsEmpty: Ember.computed('theModel.childModels', function () { return !this.get('theModel.childModels.isPending') && this.get('theModel.childModels.length') === 0; }), 也可以使用

limit

答案 4 :(得分:1)

如果您可以添加库依赖项,IntInterval中的Eclipse Collections类具有我认为您正在寻找的步骤函数。我尝试了一些将IntInterval转换为IntStream的不同方法,因为原始问题要求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的提交者

答案 5 :(得分:0)

优雅的解决方案:

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

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

答案 6 :(得分:0)

更多通用解决方案:

LongStream.range(0L, (to - from) / step) // +1 depends on inclusve or exclusive
                .mapToObj(i -> (from + i * step))
                .collect(Collectors.toList());