6

我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但是让我们面对现实吧,即使存在所有的函数式编程库,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();
    }
}
4

1 回答 1

10

没有!

Guava 项目负责人 Kevin Bourrillion 谈到 Guava 的功能特性:

“语法很烂。同时,这些东西现在,一直是,将来也只是权宜之计,直到正确的语言改变到来,那时我们终于可以真正决定最佳语法并开始函数式编程实际上,这一次让 Java 生活变得更好了。所以我不确定在函数/谓词方面投入多少精力;它在图书馆里更多是因为它必须在,而不是因为我们认为它是皇冠上的明珠。”</p>

当 Java 8 出现时,我们可能会显着改变我们的策略,但这不会持续一段时间。

此外,我们还没有找到许多我们认为Command您描述的界面将是最佳解决方案的用例。例如,我们认为您上面的代码会更好地写成

for(PhoneNumber phone : phoneList) {
  phone.call();
}

老式的方式。我们可能会相信Command.

于 2012-03-02T00:04:49.587 回答