Guava中的任何东西都类似于Functional Java的效果?

Kev*_*ker 5 java side-effects command-pattern functional-java guava

我知道纯函数式编程的目标之一是消除可变性,从而排除副作用.但是让我们面对现实吧,即使存在所有的函数式编程库,Java也不是一种函数式语言.事实上,似乎有些FP库知道并期待这一点.例如,在Functional 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 );
Run Code Online (Sandbox Code Playgroud)

所以问题是,番石榴中有类似的东西吗?

在接受澄清后接受回复

我正在开发一个框架,它可以帮助解决大多数Java FP库中固有的"垂直问题",在某些情况下.所以,我竟让如上图所示的代码示例:即明确宣布一个新的类实现的Command所有其垂直噪声过甜的烦躁,只需在声明之后立即应用它的目的.

我更多地考虑实际的命令模式,其中可能有几个可能的命令在其他地方声明,并且只有其中一个被传递到想要迭代应用它的代码中.此外,我的框架的目标是使创建功能接口对象(函数,谓词,命令,其他简单的lambda)更加惯用,而不是简单地将垂直问题移动到其他地方.我早就意识到这不在番石榴的范围内.但是由于其他FP库中有类似Command的接口,我只想知道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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 10

不!

Guava项目负责人Kevin Bourrillion对Guava的功能特性说:

"语法很糟糕.与此同时,这些东西现在,一直是并且永远只是一个权宜之计,直到正确的语言变化出现,此时我们终于可以真正决定最佳语法并开始功能式编程实际上,在Java中让生活变得更好.所以我决定投入功能/谓词的工作量是多少; 它更像是在图书馆,因为它必须是,而不是因为我们认为它是一个皇冠上的宝石."

当Java 8出现时,我们可能会大大改变我们的策略,但这还不会有一段时间.

此外,我们还没有发现很多用例,我们认为Command您描述的接口是最佳解决方案.例如,我们认为您的上述代码可以更好地编写为

for(PhoneNumber phone : phoneList) {
  phone.call();
}
Run Code Online (Sandbox Code Playgroud)

老式的方式.我们可能会相信它的优点Command,但我认为"for-each"用例几乎总是以老式的方式做得更好.

  • @KevinWelker:这个和filter/transform之间有一个_huge_的区别.过滤/转换做一些使用循环无法完成的事情:它们在恒定时间内生成视图.你的例子中的for-each就像一个循环一样可以替代. (3认同)