番石榴中任何类似于功能性Java的东西';什么影响?

番石榴中任何类似于功能性Java的东西';什么影响?,java,guava,side-effects,command-pattern,functional-java,Java,Guava,Side Effects,Command Pattern,Functional Java,我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但让我们面对现实,Java并不是一种函数式语言,即使存在所有函数式编程库。事实上,似乎有些FP库知道并期待这一点。例如,在Functional Java中,有一个类。在绝地FP库中,有一个接口。除其他外,这允许您对Iterable的元素应用具有类型安全性的命令模式,而无需讨厌的for循环样板 Command<PhoneNumber> makeCall = new Command<PhoneNumber> {

我知道纯函数式编程的目标之一是消除可变性,从而排除副作用。但让我们面对现实,Java并不是一种函数式语言,即使存在所有函数式编程库。事实上,似乎有些FP库知道并期待这一点。例如,在Functional Java中,有一个类。在绝地FP库中,有一个接口。除其他外,这允许您对
Iterable
的元素应用具有类型安全性的命令模式,而无需讨厌的for循环样板

Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
    public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );

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

“语法糟透了。同时,这东西现在、过去、将来都只是权宜之计,直到出现正确的语言变化,那时我们才能真正决定最佳语法,让函数式编程真正开始让Java的生活变得更好。所以我还不确定如何做。”在函数/谓词方面投入了大量精力;它在库中更多的是因为它是必须的,而不是因为我们认为它是皇冠上的宝石。”

当Java8出现时,我们可能会显著改变我们的策略,但这还不是一段时间

此外,我们还没有发现许多用例,我们认为您描述的
命令
接口将是最佳解决方案

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

老式的方法。我们可能会相信
命令的优点,但我认为“for each”用例几乎总是用老式的方法做得更好。

为什么“老式”呢对命令来说更好,但对过滤器和转换来说不是更好吗?另外,我知道功能特性在Java 8之前被视为权宜之计,但你必须意识到Java 8是一段时间后才会采用的,而且它不会立即被采用。仍然有一些项目停留在Java 5中(幸运的是,不是我的项目).如果你阅读,你会发现我们认为传统的方法在大多数情况下更适合于过滤器和转换。不是所有的时候——这就是我们提供这些功能的原因——但大多数时候都是如此。此外,原始帖子的代码似乎正是一个使原则上同意,但认为它过于夸张了。根据我的口味,我的单行方式比你展示的更具可读性,不仅因为它是单行,而且因为它实际上读起来更自然。用户指南的“注意事项”部分给出的示例显然是将函数和谓词相结合的示例。此外,我还制作了一个FOSS库,它可以帮助生成将现有getter封装在一行中的函数和谓词。因此,绝对可以节省净代码。@KevinWelker:这与filter/transform有很大的区别。filter/transform做一些使用循环无法完成的事情:它们在恒定时间内生成视图。a for ea在您的示例中,ch类固有地可替换为循环。
for(PhoneNumber phone : phoneList) {
  phone.call();
}