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

时间:2015-02-16 05:10:47

标签: java algorithm lambda functional-programming java-8

在了解Java 8中的lambda之后,我一直在努力思考功能。

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

我如何在功能上表达这一点?或者,有些事情在程序上更好地表达了吗?我提出的方法1)不起作用,因为forEach返回void,即使它确实有效,与我的程序版本中使用的增强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));
}

1 个答案:

答案 0 :(得分:3)

从纯函数式编程的角度来看,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));