我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但是让我们面对现实吧,即使存在所有的函数式编程库,Java 也不是一种函数式语言。事实上,一些 FP 库似乎知道并期待这一点。例如在函数式 Java 中,有Effect
类。在 Jedi FP 库中,有Command
接口。这允许您 - 除其他外 - 将具有类型安全性的命令模式应用于 an 的元素,Iterable
而无需讨厌的 for 循环样板。
Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );
所以问题是,番石榴中是否有类似的东西?
在接受澄清后编辑
我正在开发一个框架,在某些情况下帮助解决大多数 Java FP 库中固有的“垂直问题”。因此,我实际上不会制作如上所示的代码示例:即,显式声明一个新的类实现及其Command
所有垂直噪声 icky-ness,只是为了在声明之后立即应用它。
我更多地考虑实际命令模式的思路,其中可能在其他地方声明了几个可能的命令,并且只有其中一个被传递到想要迭代应用它的代码中。此外,我的框架的目标是让创建函数式接口对象(函数、谓词、命令、其他简单的 lambdas)更加地道,而无需简单地将垂直问题移到其他地方。我早就意识到这不在 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();
}
}