6

Java 7 是否支持函数式编程,或者我仍需要使用 FunctionalJava 或其他库?我认为它对此有支持,但没有找到太多关于它的信息。

4

1 回答 1

12

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

无论如何,您的问题的答案是否定的。Lambda 本来应该出现在 Java7 中,但它们只会出现在 Java8 中。看起来使用 Java8,在您需要类似 FunctionalJava 之类的东西之前,您可以使用新的 lambda 表示法与常规 JDK​​8 类库 (特别是集合)一起做很多事情,但这取决于您想要多少做。很多 OO 人都会对 FP 的风格感到非常满意——一个常见的例子是集合mapfilter等等。这本身无疑会使 Java更接近FP——并且可能对你来说就足够了 FP。

问题是,即便如此,这是否允许在 Java 中进行真正的(即使是“不纯的”)函数式编程?是的,也不。是的,因为任何具有词法闭包和 lambda 表示法的语言在理论上都足够了。 ,因为语言Haskell,F#和支持OCAML的FPScala仍然不切实际。

一些例子:

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

其他语言,如 Lisp/Scheme 或 Erlang 也被认为是函数式的;但在不那么严格的意义上;要求 (1) 和 (2) 不适用,因为它们是动态类型的。

可以说,Javascript 与 Lisp(非纯动态函数式语言)功能差不多,因为 Javascript 一直都有 lambda 和一流的函数。但是 Java 属于静态类型家族,它的表现并不比 Javascript 好(比 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

于 2012-11-29T02:13:30.643 回答