Functional Java和Guava之间有很好的比较吗?

我想在我将要教授的课程中使用Functional Java或Guava(或者不太可能使用Scala)。 尽管在JVM上运行了许多函数式语言,但我希望坚持使用尽可能类似于Java的东西,即在Java 8中具有预期的function特性,在概念和语法上最兼容的东西。 。

看起来functionJava和番石榴是最好的候选者。 我无法在function,易用性,概念接近直接Java等方面找到任何比较它们的东西。有没有人知道这些库之间的良好比较?

Guava的目标不是在Java中提供function习语。 从Functional Explained Guava wiki页面:

过度使用Guava的函数式编程习语会导致冗长,混乱,难以理解和低效的代码。 这些是迄今为止最容易(也是最常见)被滥用的番石榴部分,当你为了使你的代码“单行”而荒谬的长度时,番石榴团队就会哭泣。

在使用Guava的function实用程序时,请确保传统的命令式处理方式不易读取。 试着把它写出来。 那么糟糕吗? 那比你想要尝试的荒谬笨拙的function方法更具可读性吗?

由于开销过高(参见垂直问题 ),因此过于依赖function习语对Java 7没有多大意义。 这将随Java 8而改变,这将改变Java库和程序在详细级别上的设计方式。 在Java 8中,在某种程度上不鼓励Java中有意义的事情。这将激发新版本的Effective Java和许多新的API。

如果您正在尝试教授函数式编程,那么最好坚持使用(或多或少)纯函数式语言。 每种语言都是FP和OOP的混合(或仿真)会分散注意力。

如上所述,Guava只是一个Java库 – 一个Java 5兼容的库,甚至(从版本11开始)。 番石榴在函数式编程中的地位由Kevin Bourrillion总结:

“语法很糟糕。 与此同时,这些东西现在,一直都是,并且永远只是一个权宜之计,直到正确的语言变化出现,此时我们终于可以真正决定最佳语法并开始function式编程实际上,在Java中让生活更美好一次。 所以我不确定将多少精力放入Function / Predicate中; 它更像是在图书馆,因为它必须是,而不是因为我们认为它是皇冠上的gem。“

由于Guava更像是一个通用库,恰好具有function惯用语,而Functional Java纯粹是关于在Java中实现function习惯用法,因此functionJava听起来更像是一个更完整的FP类function。

另一方面,我更喜欢Guava, 因为它更通用,因此我发现自己使用了几个与function习语无关的function。

两个库的问题之一(如上面post中的Guava Wiki所述)是function对象的匿名内部类的“垂直噪声”。 另一个试图通过注释和APT修复此问题的库是Jedi 。

如果没有注释,使上述任何库(Guava,FJ或Jedi)噪声较小的另一种方法是我写的一个库, Funcito ,受到Mockito语法的启发。 它在这一点上可以简化得更加局限,基本上包含单个方法调用,但这是我目前已经发现自己大部分时间都在做的事情。