Java 7中的函数编程

Dea*_*ock 6 java functional-programming

Java 7是否具有函数式编程支持,或者我仍然需要使用FunctionalJava或其他lib?我以为是支持这个,但没有找到太多关于它的信息.

Fai*_*aiz 12

这取决于您对函数式编程的定义.

在任何情况下,你的问题的答案都是否定的.Namdas应该一度出现在Java7中,但它们只出现在Java8中.它看起来像Java8你就可以做很多新的λ符号结合常规JDK8类库 (特别是集合),你需要像以前FunctionalJava,但那种取决于你想要多少做.很多OO民间的会很幸福只是一个FP的味道-一个常见的例子是收藏用map,filter等这本身无疑将移动Java的接近,以FP -并且可能只是FP够你.

即使在那时,问题是允许在Java中进行真正的(即使是"不纯的")函数式编程?是的,编号,因为词法闭包和一个lambda符号的任何语言在理论上是不够的. 没有,因为FP由语言支持Haskell,F#,OCAMLScala仍然是不切实际的.

一些例子:

  1. 缺乏代数数据类型 - 这些被认为是静态类型FP语言系列的关键组成部分,并且特别适用于许多FP习语.
  2. 虽然不完全是FP的要求,但几乎所有静态类型的FP语言都具有某种形式的类型推断.
  3. 声明需要表现得像表达了很多的函数式编程的成语,以方便- if,try等需要返回一个值.
  4. 执行(如在Haskell中),或鼓励(如在Scala中)的 单一赋值不变性,以及为此目的的有用的数据结构和库集合.

其他语言如Lisp/Scheme或Erlang也被认为是功能性的; 但从严格意义上讲; 要求(1)和(2)不适用,因为它们是动态键入的.

可以说,Javascript与Lisp(不纯的动态函数语言)一样功能,因为Javascript总是有lambdas和一流函数.但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