【问题标题】:How lambda expression in Java 8 enables functional programming?Java 8 中的 lambda 表达式如何实现函数式编程?
【发布时间】:2018-01-25 09:40:04
【问题描述】:

Java 8 中的 lambda 表达式如何实现函数式编程? 因为 lambda 表达式类型表示为接口,它是面向对象的类类型。

普通方法调用与 lambda 表达式语句有何不同?

【问题讨论】:

    标签: lambda functional-programming java-8 functional-interface


    【解决方案1】:

    Lambda 不支持函数式编程。它允许您以更实用的方式处理数据。

    Java 是一种 OOP 语言,其中 一等公民 是对象,而不是函数。因此,即使你声明了一个 lambda 表达式,你也必须将它分配给某个 Functional Interface,正如你所说的,这是一个面向对象的类类型。

    但是,在 Java 8 中,您可以使用 lambda 表达式,它是一个匿名函数,像一等公民一样以函数式风格处理数据。例如。您可以将匿名函数作为方法参数传递

    accounts.stream()
            .map(account -> account.getEmail())
            .filter(email -> email.endsWith("gmail.com"))
    

    这是一个有效的 Java 8 代码,您在其中 作为方法参数传递,而不是值,而是函数。当然,在底层这些 lambda 成为实现函数式接口 Function<Account,String> 的类的实例, 和 Predicate<String> 相应地,但它仍然允许您以比旧 Java 版本更实用的方式处理数据。

    以函数式风格处理数据的整个想法还涉及流、函数式接口和方法引用,因此在考虑 Java 中的函数式编程时应该考虑所有这些。

    【讨论】:

      【解决方案2】:

      在函数式编程世界中,函数也是对象,可以被视为传统对象。

      Lambda 本身只是没有名称句柄的行为。如果你写x -> x + 1,你只是创建了一个表示增量(或两个字符串的串联)的值。

      此选项不仅允许将经典对象组合在一起,还允许组合行为/动作 - 这对于大量使用声明式编程的函数式编程至关重要 - 为了能够实现这一点,您需要能够通过某种方式的行为。

      但是,Lambda 表达式的存在不会使任何语言自动运行 - 它还有更多功能,例如不变性、代数数据类型、无副作用、函子、数据类型……等等。


      因此,lambda 和方法之间的关系在某种程度上类似于匿名值和类字段之间的关系。

      【讨论】:

        【解决方案3】:

        让我们想象一下没有类字段、setter 和 getter 的纯 OOP。 只有类和方法... 我们得到了一个纯函数式编程。 事实上,OOP - 通过添加状态来扩展函数式编程。 State 通过存储从类构造函数传入的输入参数,增加了可重用性,节省了时间。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-01
          • 2015-07-05
          • 1970-01-01
          相关资源
          最近更新 更多