当前位置: 首页 > 面试题库 >

Java 8 Lambda表达式和一等值

仲阳朔
2023-03-14
问题内容

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


问题答案:

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

我在另一个StackExchange问​​题的答案中已经解决了语法糖的问题。

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

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

有关lambda是否为对象的更多信息,请参见Lambda常见问题解答。

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

  • 有各种方法,例如equalsgetClasshashCodenotifytoString,和wait
  • 有一个身份哈希码
  • 可以通过一个锁定synchronized
  • 可以使用==and !=instanceof运算符进行比较

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

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

更新2013-10-24

自几个月前发布答案以来,我一直在进一步考虑这个话题。从技术角度来看,我上面写的所有内容都是正确的。由于Java 8 lambda不是 纯值 (相对于

等值),因此该结论可能更精确地表达,因为它们带有很多对象包。但是,仅仅因为它们不纯净并不意味着它们不是一流的。考虑一下Wikipedia对一流功能的定义。简而言之,此处列出的考虑一流功能的标准是:

  • 将函数作为其他函数的参数传递
  • 从其他函数返回函数
  • 将函数分配给变量
  • 将函数存储在数据结构中
  • 具有匿名功能

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

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

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



 类似资料:
  • 是 i = 表达式;等于i =表达式,那么登录的目的是什么? 大家好,我对下面这个问题很困惑;i =表达式;//意味着i = i表达式那么这个i =表达式呢;//我在eclipse上进行了测试,简单地找到了结果i = expression 所以 i = 表达式;等于 i = 表达式 那么登录的目的是什么? 我知道黑白 i(前增量)和 i(后增量)的区别 谢谢你!

  • 我被与的对比所困扰 我正在尝试验证客户端的用户输入值。对于它们的名字和姓氏,我有一个表达式,它适用于; 我需要JavaScript Regex的équivalent 我有很多困难的时间来解决它,没有任何工作。 Ex; null 非常感谢您的帮助。

  • 变量 变量的类型: AutoHotkey 中没有明确的变量类型. 然而, 只包含数字 (可以含有小数点) 的变量进行数学运算或比较时, 会被自动转换为数值. (为了提高性能, 在内部会对数字进行缓存以避免与字符串之间的转换.) 变量的作用域和声明: 除了函数中的 局部变量, 其他所有变量都是全局的; 即可以在脚本的任意位置读取或修改它们的内容. 除了在函数页面注明的情况,变量都是不需要声明的;使用

  • 问题内容: 我可以在Sql Server Reporting Services中使用表达式来组合组中列的所有值吗?我正在尝试完成MySQL的group_concat函数的功能,但是要在报告中(而不是在查询中)。 例子。我要制作以下数据: 在报告中查看以下内容: 问题答案: 尝试这样的事情(适用于SQL Server 2005及更高版本): 输出:

  • 问题内容: 我的问题是:在GWT中使用正则表达式是否有很好的解决方案? 例如,我对String.split(regex)的使用不满意。GWT将代码转换为JS,然后将正则表达式用作JS正则表达式。但是我不能使用Java Matcher或Java Pattern之类的东西。但是我需要这些来进行组匹配。 有没有可能或图书馆? 我尝试了Jakarta Regexp,但是还有其他问题,因为GWT不能模拟该库

  • 问题内容: 我有一个脚本,可以分析电视剧集的文件名(例如show.name.s01e02.avi),获取剧集的名称(从www.thetvdb.com API),然后自动将其重命名为更好的名称(显示名-[01x02 ] .avi) 该脚本可以正常工作,直到您尝试在具有Unicode显示名称的文件上使用该脚本为止(我从未真正考虑过这一点,因为我拥有的所有文件都是英文的,所以大部分都属于) 如何允许正则