用Java中的`forEach'替换`reduce`终端方法

时间:2017-05-10 06:06:56

标签: java lambda java-8 java-stream

我制作了一种建造墙的方法。我正在使用流方法,起初我使用reduce,但我试图查看forEach是否有效。

以下是我的代码

public static void main(String[] args) {
        if (args.length < 3) {
            System.out.println("Need three integer arguments: width height #bricks");
            System.exit(1);
        }
        int width = Integer.parseInt(args[0]);
        int height = Integer.parseInt(args[1]);
        int numberOfBricks = Integer.parseInt(args[2]);
        assert numberOfBricks <= width * height: "Too many bricks";
        System.out.printf("Will build a wall %d wide and %d tall%n", 
            width, height);
        System.out.println(String.join("", Collections.nCopies(width,"==")));
        final Wall wall = new Wall(width, height); //UPDATE
        Wall trumpWall = 
            Stream.generate(() -> new Ball(10.0))
             .filter(b -> b.colour == Ball.Colour.RED)
             .map(Brick::new)
             .limit(numberOfBricks)
             .forEach(wall::lay) //UPDATE
                Wall::linkTwoWalls);
        System.out.println(trumpWall);
    }    
}

有人可以建议如何解决这个问题吗?我发现使用forEach更简单,因此更容易阅读。

1 个答案:

答案 0 :(得分:1)

forEach方法仅需Consumer<T>。你只能用元素做东西,而不是返回一个值。

您在这里尝试做的只是为每个砖块调用lay(brick),对吗?

然后,您可以先在流方法链之外创建Wall对象:

final Wall wall = new Wall(width, height);

然后在forEach中,执行此操作:

.forEach(wall::lay);

执行该行之后,wall将成为一块有很多砖块的墙。

显然,您还想将两面墙连在一起。不幸的是,我无法理解你想要连接哪两面墙。如果您再解释一下,我可以帮助您。