Java7中的函数式编程

Java7中的函数式编程,java,functional-programming,Java,Functional Programming,Java 7是否支持函数式编程,或者我仍然需要使用FunctionalJava或其他库?我认为is对此有支持,但没有找到太多相关信息。这取决于您对函数式编程的定义 在任何情况下,您的问题的答案都是否定的。Lambdas将在某一时刻出现在Java7中,但它们将只出现在Java8中。在使用Java8时,您可以在需要FunctionalJava之类的东西之前(尤其是集合),但这取决于您想做多少。很多OO爱好者都会对FP的味道感到非常高兴-一个常见的例子是带有map、filter等的集合。这本身无疑会让

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

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

在任何情况下,您的问题的答案都是否定的。Lambdas将在某一时刻出现在Java7中,但它们将只出现在Java8中。在使用Java8时,您可以在需要FunctionalJava之类的东西之前(尤其是集合),但这取决于您想做多少。很多OO爱好者都会对FP的味道感到非常高兴-一个常见的例子是带有
map
filter
等的集合。这本身无疑会让Java更接近FP-并且可能对您来说已经足够FP了

问题是,即使如此,这是否允许Java中的函数编程是真的(即使是“不纯的”)?是的,也不是。是的,因为任何带有词汇闭包和lambda符号的语言在理论上都足够了。不,因为由语言
Haskell
F#
OCAML
Scala
支持的FP仍然是不切实际的

一些例子:

  • 缺乏-这些被视为该计划的一个关键组成部分 静态类型的FP语言家族,特别适合许多FP习语
  • 虽然不完全是FP的要求,但几乎所有静态类型的FP语言都具有 某种形式的类型推断
  • 对于许多函数式编程来说,语句的行为需要像表达式一样 方便使用的习惯用法-
    如果
    尝试
    ,等等需要返回一个值
  • 强制执行(如Haskell),或鼓励(如Scala) 单一赋值、不变性和有用的集合 为此目的建立了数据结构和库
  • 其他语言如Lisp/Scheme或Erlang也被认为是功能性语言;但在不那么严格的意义上;需求(1)和(2)不适用,因为它们首先是动态键入的

    可以这样说,Javascript的功能与Lisp(不纯的动态函数语言)差不多,因为Javascript总是有lambdas和一流的函数。但是Java属于静态类型家族,并不比Javascript好,当然也不如现有的静态类型FP语言

    关于(4)(不可变/无副作用)),在JDK8中,现有的可变类将使用lambda消费方法进行改造,因此这将(至少在一段时间内)限制您在Java8中使用FP范式的程度

    我发现这些链接非常有用-虽然我已经有一段时间没有跟踪了,所以我不确定它们是否是关于这方面的最佳/最新信息。但值得一读:


    您可以在OpenJDK上了解当前的状态。即使Java添加了Lambdas,我仍然认为它并不适合。尽管您可能会尝试,Java的命令性本质将不断地干扰。不过,您仍然可以从尝试中获得好处。就像更好的状态管理一样,但是JVM中还有其他语言工作得更好。希望不是。不要把oo和func混为一谈。@AlexWien为什么不?Scala和F#成功地做到了这一点。更不用说,C#的lambda非常非常好。java提供了一种类型推断形式:good point。但与局部类型推理(Scala)或成熟的Hindley-Milner类型推理(Haskell,ML)相比,在冗长性方面的节省仍然非常小。虽然Java的类型推理在处理泛型方法和泛型类的实例化时很有帮助,但FP样式的类型推理允许您使用无显式声明的局部变量,并且静态检查它们。我想说,差异是巨大的,因为它显著地促进了简洁。事实上,差异是非常大的!我只是想指出,Java也有某种类型的推理,尽管它不能与“适当的”函数式语言相比