如何将功能概念应用于 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));
在 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));