有 Java 编程相关的问题?

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

java IntStream按步骤迭代

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

我尝试了iterate,但这从未停止执行

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

共 (6) 个答案

  1. # 1 楼答案

    实际上,你也可以通过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. # 2 楼答案

    limit也可以使用

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

    如果您可以添加库依赖项,那么Eclipse Collections中的^{}类具有我认为您需要的step函数。我尝试了几种不同的方法将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 like IntStream.rangeClosed()

    注意:我是Eclipse集合的提交者

  4. # 4 楼答案

    在JDK9中有takeWhile1

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

    实际上range是理想的选择

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

    编辑:霍尔格的解决方案是执行最快的解决方案

    因为下面几行代码

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

    优雅的解决方案:

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

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