如何将功能概念应用于 Java 8 中的传统过程算法?

How to apply functional concepts to traditionally procedural algorithms in Java 8?

在 Java8 学习了 lambda 之后,我一直在尝试更函数式地思考。

例如,在这个算法中,我循环遍历一个数组,以查看数组中的哪个 GraphicsDevice 与当前正在使用的 GraphicsDevice 匹配。它将不匹配元素的值设置为false,并将匹配元素的值设置为true。

我将如何从功能上表达这一点? 或者,有些事情是否可以更好地在程序上表达?我想出的方法 1) 不起作用,因为 forEach returns void,即使它起作用了,与我的 "procedural version" 算法中使用的增强 for 循环相比,它感觉不自然。

public void findCurrentMonitor() {

    GraphicsDevice current = frame.getGraphicsConfiguration().getDevice();

    // Procedural version
    for (Monitor m : monitors)
        if (m.getDevice() == current) m.setCurrent(true);
        else m.setCurrent(false);

    // Functional version
    monitors.stream()
    //  .forEach(a -> a.setCurrent(false)) # Impossible. Returns void.
        .filter (a -> a.getDevice() == current)
        .forEach(a -> a.setCurrent(true));
}

从纯函数式编程的角度来看,Monitor 应该是不可变的。你可以这样做:

Stream<Monitor> stream = monitors.stream().map(x -> new Monitor(m.getDevice(), m.getDevice()==current));

以防万一,您希望改变相同的 monitors,为什么不直接:

monitors.stream().forEach(a -> a.setCurrent(a.getDevice() == current));