gpt4 book ai didi

java - Java 8 Lambda表达式和一等值

转载 作者:IT老高 更新时间:2023-10-28 21:05:04 25 4
gpt4 key购买 nike

Java 8闭包真的是一流的值,还是仅仅是语法糖?

最佳答案

我会说Java 8闭包(“Lambdas”)不仅是语法糖,也不是一流的值(value)。

我已经将answer中的语法糖问题解决了另一个StackExchange问​​题。

至于lambda是否为“一流”,这实际上取决于您的定义,但我将说明lambda不是真正的一流。

从某种意义上讲,lambda希望成为一个函数,但是Java 8并未添加函数类型。而是将lambda表达式转换为功能接口(interface)的实例。这允许将lambdas添加到Java 8中,而对Java的类型系统仅作很小的更改。转换后,结果就是与其他任何引用类型一样的引用。实际上,使用Lambda(例如,在通过lambda表达式作为参数传递的方法中)与通过接口(interface)调用方法是没有区别的。接收到功能接口(interface)类型的参数的方法无法确定它是通过lambda表达式传递的,还是通过某个类的实例恰好实现了该功能接口(interface)的实例。

有关lambda是否为对象的更多信息,请参见此问题的Lambda FAQ Answer

假设将lambda转换为对象,它们将(从字面上)继承对象的所有特征。特别是对象:

  • 有各种方法,例如equalsgetClasshashCodenotifytoStringwait
  • 具有身份哈希码
  • 可以由synchronized
  • 锁定
    可以使用 ==!=以及 instanceof运算符比较


  • 等等。实际上,所有这些都是与lambda的预期用法无关的。它们的行为基本上是不确定的。您可以编写一个使用其中任何一个的程序,您都会得到一些结果,但是结果可能因发行版本而异(甚至是逐个运行!)。

    更简洁地重申这一点,在Java中,对象具有身份,但是值(尤其是函数值,如果它们存在的话)不应具有任何身份概念。 Java 8没有功能类型。相反,lambda表达式会转换为对象,因此它们有很多与函数无关的包,,尤其是身份。在我看来,这并不像“一流”。

    更新2013-10-24

    自几个月前发布答案以来,我一直在进一步考虑这个话题。从技术角度来看,我上面编写的所有内容都是正确的。由于Java 8 lambda不是纯(相对于一流)值,因此该结论可能更精确地表达,因为它们带有很多对象包。但是,仅仅因为它们不纯净并不意味着它们不是一流的。考虑一等函数的Wikipedia definition。简而言之,此处列出的考虑一流功能的标准是:
  • 将函数作为其他函数的参数传递给
  • 从其他函数返回函数
  • 将函数分配给变量
  • 将函数存储在数据结构
  • 具有匿名函数

  • Java 8 lambda满足所有这些条件。因此,这确实使它们显得一流。

    本文还提到了没有特殊状态的函数名称,相反,函数名称只是类型为函数类型的变量。 Java 8 lambda不满足最后一个条件。 Java 8没有函数类型。它具有功能接口(interface)。它们像函数类型一样有效地使用,但根本不是函数类型。如果您有一个类型为功能接口(interface)的引用,则不知道它是lambda,匿名内部类的实例还是碰巧实现该接口(interface)的具体类的实例。

    总之,Java 8 lambda是比我最初想象的更一流的函数。它们不是纯粹的一流功能。

    关于java - Java 8 Lambda表达式和一等值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15221659/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com