在了解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));
}
答案 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));