2011-12-22 32 views
13

我想在我将教授的课程中使用Functional Java或Guava(或不太可能的Scala)。尽管在JVM上运行的函数语言很多,但我仍想坚持一些看起来尽可能像Java一样的东西,也就是说,它们在概念上和语法上最兼容,具有Java 8中预期的功能特性功能性Java和番石榴之间有很好的比较吗?

看起来像Functional JavaGuava是最好的候选人。在能力,易用性,对直接Java的概念性接近性等方面,我还没有找到任何比较它们的方法。有谁知道这些库之间有很好的比较吗?

+1

这里有什么问题?你可能想编辑你的问题,使其更清楚你问的是什么... \ [编辑\]问题在标题中,是的,但是你可能想在Q中重新修饰它。 – BenCole 2011-12-22 20:18:20

+2

番石榴只是一个有很多有用的实用方法的Java库。是的,它确实有一些东西可以让你以功能方式进行编程,但它并不特别专注于函数式编程。 – Jesper 2011-12-22 20:45:55

+0

感谢您的答案。我错误地理解了番石榴的目标。我还花了一点时间来研究Functional Java。它也是(仍然)被当前的Java语法压低。这导致我现在倾向于Scala。我意识到Scala正在变得越来越主流。即使如此,我认为对于大多数学生来说,学习如何在直接Java中进行函数式编程将是最有价值的。 (当我们把函数式编程作为一个“范式”来使用时,我们使用Haskell,但我怀疑学生们是否学到了足够的东西,但要把它带入他们的血液中。)这引出了一个问题:什么时候Java 8有望? – RussAbbott 2011-12-24 16:22:06

回答

17

番石榴的目标不是提供Java中的功能性成语。从Functional Explained番石榴wiki页面:

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

请确定,在使用番石榴的功能性实用程序时, 传统的做事方式不可读。试试 写出来。那么糟糕?比你想尝试的荒谬尴尬的功能方法更具可读性吗?

由于负担过重(参见vertical problem),过度依赖功能成语使Java 7不太了解。这将随着Java 8而改变,这将改变Java库和程序在细节层面上的设计方式。在Java 8中,对于Java而言有意义的东西在某种程度上会受到阻碍。这将激发新版本的Effective Java和许多新的API。

如果你想教功能性编程,最好坚持一个(或多或少)纯功能语言。每种语言都是FP和OOP的混合语言(或模拟语言)将会让人分心。

+3

我还应该指出这篇文章中的前面的句子: “从Java 7开始,Java中的函数式编程只能通过笨拙和冗长的匿名类来使用,这在Java 8中有望改变,但Guava是目前针对Java 5及以上版本的用户。“ – 2011-12-23 10:51:40

6

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

“语法很糟糕。与此同时,现在这种东西,一直是,而且永远只是一种权宜之计,直到正确的语言变化才能出现,那时我们终于可以真正地决定最佳语法,并开始功能式编程实际上让Java的生活更美好一次。所以我不确定要在功能/谓词中加入多少功夫;它在图书馆更多,因为它必须是,而不是因为我们认为它是一颗皇冠上的宝石。“

4

由于Guava更像是一个具有功能性惯用语的通用库,而Functional Java纯粹是关于在Java中实现功能语言,Functional Java听起来更适合于更完整的FP类功能。

另一方面,我更喜欢番石榴,因为它更通用,因此我发现自己使用了几个与功能性成语无关的功能。

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

另一种让上述库(Guava,FJ或Jedi)没有注释的低噪声库的方法是我编写的库,Funcito,灵感来自Mockito的语法。它在这一点上可以简化的更加有限,基本上包装了单一的方法调用,但这正是我目前发现自己大部分时间都在做的事。

+0

当你的意思是垂直噪音。你是在谈论冗长的编码,因为它涉及到在创建一堆字节码类文件时在你的jar库中添加匿名内部类或开销? – 2012-02-09 21:18:55

+0

前者:匿名内部类。 – 2012-02-10 01:51:13