Java 7中的函数式编程

6

Java 7是否支持函数式编程,还是需要使用FunctionalJava或其他库?我认为它已经支持了,但是没有找到太多相关信息。


3
您可以在OpenJDK网站上查阅有关Project Lambda目前状态的信息。 - Greg Hewgill
4
即使Java添加了Lambda表达式,我仍然认为它并不是一个很好的选择。尽管你可以努力尝试,但Java的命令式本质将会不断干扰。虽然你仍然可以从中获得好处,例如更好的状态管理,但在JVM环境中有其他语言可以更好地完成这项工作。 - BillRobertson42
希望不会。不要混淆面向对象和函数。 - AlexWien
@AlexWien 为什么不呢?Scala和F#成功地做到了这一点。更不用说,C#的lambda表达式真的非常好用。 - Paolo del Mundo
1个回答

12

这要取决于你对函数式编程的定义。

无论如何,对于你的问题,答案是不。Lambda表达式曾经在Java7中出现过一次,但它们仅会出现在Java8中。看起来,在Java8中,你可以通过新的lambda符号和常规的JDK8类库(特别是集合)结合使用来完成很多工作,在你需要像FunctionalJava这样的东西之前。但这取决于你想做多少。许多面向对象的人将只使用FP的一种风格-一个常见的例子是具有mapfilter等功能的集合。这本身无疑会将Java 更接近 FP-并且可能对你来说已经足够了。

即使如此,这是否允许在Java中进行真正的(即使是“不纯”的)函数式编程呢? 是和否。 是,因为理论上具有词法闭包和lambda符号的任何语言都足够了。 不,因为由语言Haskell、F#、OCAML和Scala支持的FP仍然是不切实际的。
一些例子:
  1. 缺乏代数数据类型 - 这被认为是静态类型的FP语言家族的关键组成部分,并且与许多FP习惯用法非常契合。
  2. 虽然不是FP的必要条件,但几乎所有静态类型的FP语言都具有某种形式的类型推断
  3. 对于许多函数式编程习惯用法来说,语句需要像表达式一样运作才更方便 - iftry等需要返回值
  4. 执行(如Haskell中)或鼓励(如Scala中)单赋值以及不可变性,以及一组有用的数据结构和库来实现这一目标。

其他像Lisp/Scheme或Erlang这样的语言也被认为是函数式的;但在较不严格的意义上;因为它们本来就是动态类型的。

你可以这样说,Javascript与Lisp(不纯的动态函数语言)一样具有函数式编程的特性,因为它一直有lambda和一级函数。但是Java属于静态类型家族,不如Javascript,并且明显比现有的静态类型FP语言差。
关于(4.不可变/无副作用) ,似乎在JDK8中,现有的可变类将会加上消耗lambda的方法,所以这至少在Java8中会限制FP范式的使用。
我发现这些链接非常有用 - 尽管我已经有一段时间没有关注了,所以我不确定它们是否是最好/最新的关于此的信息。但是值得阅读:

http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html

http://cr.openjdk.java.net/~briangoetz/lambda/collections-overview.html


1
Java具有一种类型推断的形式:http://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html - Jonas Adler
1
不错的观点。但与本地类型推断(Scala)或完整的Hindley-Milner类型推断(Haskell,ML)相比,节省的冗余仍然非常小。虽然Java的类型推断在处理通用方法和通用类的实例化时有所帮助,但FP风格的类型推断使您可以拥有无需显式声明即可进行静态检查的局部变量。我认为差异是巨大的,因为它显着有助于简洁性。 - Faiz
确实,差别很大!只是想指出,尽管Java也有某种类型推断,但它与“真正”的函数式语言的类型推断是无法相比的。 - Jonas Adler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接