我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但让我们面对现实吧,即使存在所有函数式编程库,Java 也不是一种函数式语言。事实上,一些 FP 图书馆似乎知道并期望这一点。例如,在函数式 Java 中,有Effect班级。在 Jedi FP 库中,有Command界面。这允许您(除其他外)将具有类型安全性的命令模式应用于Iterable
没有令人讨厌的 for 循环样板。
Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );
那么问题来了,Guava 里有类似的东西吗?
在接受澄清答案后进行编辑
我正在开发一个框架在某些情况下,这有助于解决大多数 Java FP 库固有的“垂直问题”。所以我会not实际上使代码示例如上所示:即显式声明一个新的类实现Command
及其所有令人讨厌的垂直噪声,只是为了在声明后立即应用它。
我更多地考虑了实际的命令模式,其中可能有几个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代应用它的代码中。此外,我的框架的目标是使创建函数接口对象(函数、谓词、命令、其他简单的 lambda)变得更加惯用,而无需简单地将垂直问题转移到其他地方。我早就意识到这不属于Guava的范围了。但由于其他 FP 库中也提供了类似命令的界面,我只是想知道 Guava 中是否存在类似的界面。
使用我的框架的更完整的代码示例可能如下所示:
class Stuff {
private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());
// methods exist for use elsewhere, but are conveniently also wrapped as commands
public void someMethod1() {...}
public void someMethod2() {...}
}
class Activity {
public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
doSomeThings();
...
forEach(stuffs, doCmd);
...
doOtherThings();
}
}
Nope!
Guava 项目负责人 Kevin Bourrillion 曾这样评价 Guava 的功能特点:
“语法很糟糕。与此同时,这些东西现在、过去、将来都只是权宜之计,直到出现正确的语言变化,那时我们才能最终真正决定最佳语法并开始函数式编程实际上这一次让 Java 的生活变得更好了。所以我不确定要在函数/谓词方面投入多少精力;它更多地被放在图书馆里,因为它有点必须存在,而不是因为我们认为它是皇冠上的宝石。”
当 Java 8 出现时,我们可能会显着改变我们的策略,但这不会持续一段时间。
此外,我们还没有发现很多我们认为的用例Command
您描述的界面将是最好的解决方案。例如,我们认为您的上面的代码最好写成
for(PhoneNumber phone : phoneList) {
phone.call();
}
老式的方式。我们可能会相信Command
,但我认为“for-each”用例几乎总是以老式方式完成更好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)