代码之家  ›  专栏  ›  技术社区  ›  dushkin

这是IntStream嵌套循环的最佳选择吗?错误是什么?

  •  -1
  • dushkin  · 技术社区  · 8 年前

    我想创建一个从0到500的三重嵌套迭代,步进10。

    我尝试了下面的操作,结果在结束圆括号时出错。 你能给我个建议吗?

    谢谢您。

    public class App {
        public static void main(String[] args) {
    
            IntStream.rangeClosed(0, 500).filter(a -> a % 10 == 0).forEach( a ->
                    IntStream.rangeClosed(0, 500).filter(b -> b % 10 == 0).forEach( b ->
                            IntStream.rangeClosed(0, 500).filter(c -> c % 10 == 0).forEach( c->
                                    System.out.println(a + ", " + b + ", " + c);
                            );
                    );
            );
        }
    }
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Eran    8 年前

    不是在每个流中生成501个元素,然后过滤所有不可被10整除的元素,而是可以生成 IntStream 仅包含10的倍数:

    IntStream.iterate(0, i->i+10).limit(51).forEach( a ->
                IntStream.iterate(0, i->i+10).limit(51).forEach( b ->
                        IntStream.iterate(0, i->i+10).limit(51).forEach( c->
                                System.out.println(a + ", " + b + ", " + c)
                        )
                )
    );
    
        2
  •  1
  •   Anonymous    8 年前

    我的建议是:

        IntStream.rangeClosed(0, 50)
                .forEach(a -> IntStream.rangeClosed(0, 50)
                        .forEach(b -> IntStream.rangeClosed(0, 50)
                                .forEach(c -> System.out.format("%3d, %3d, %3d%n",
                                        a * 10, b * 10, c * 10))));
    

    输出摘录:

      0,   0,   0
      0,   0,  10
      0,   0,  20
      0,   0,  30
      0,   0,  40
    
    …
    500, 500, 490
    500, 500, 500
    

    这个 limit(51) 在里面 Eran’s answer 看起来有点滑稽。

    你的密码出了什么问题? 正如伊兰在书中所说 a comment ,不能有分号, ; ,在流中的方法调用之后(除非被大括号包围)。只要去掉前三个分号,代码就可以工作了。