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

时间:2018-08-26 08:13:35

标签: java java-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 个答案:

答案 0 :(得分:3)

您可以生成IntStream,它们仅包含10的倍数,而不是在每个流中生成501个元素,然后过滤所有不能被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)
                    )
            )
);

答案 1 :(得分:1)

我的建议是:

    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

Eran’s answer中的limit(51)看起来很有趣。

您的代码出了什么问题?如Eran在a comment中所说,在流中的方法调用之后,除非有花括号,否则您不能使用分号;。 )。只需删除前三个分号,您的代码就可以使用。