当前位置: 首页 > 知识库问答 >
问题:

在“lambda”和“匿名类”的上下文中理解Java中的“lambda表达式”

唐涛
2023-03-14

我读过相当多关于lambda的文章。但他们是微妙的怀疑:

问题1. lambda表达式的定义。

  1. 我在oracle页面上没有找到明确的定义
  2. 该链接表示“因此,Java lambda表达式是一个不属于任何类的函数。”
  3. 该链接表示“Lambda表达式是可以传递的匿名函数的简明表示。”
  4. 该链接表示“Lambda表达式基本上表示函数接口的实例

第二和第三个链接没有提到任何关于功能接口的内容。第四个链接听起来不错,但没有说明lambda表达式的“匿名”方面。我们可以像这样更完美地定义它们吗:

Lambda表达式是“定义函数接口匿名实现的语法简明表达式”。

我相信在定义中指定“函数接口”这个词应该足以说明我们实现了它的唯一方法,并且它的行为类似于函数,而不是类,即使是匿名类。

我们是否区分lambda和lambda表达式?

我觉得有区别,因为lambda表达式可以用于定义无状态lambda和有状态闭包(即外部词法范围中的访问变量)。看来,这就是为什么oracle link不使用没有“表达式”的单词“lambda”。然而,其他链接并非如此。

这个链接说,对于lambda表达式,“我们不需要像编写匿名类那样编写很多样板。”这听起来像“Lambda表达式就像匿名类,只是”,“我们不需要像匿名类那样编写很多样板。”我觉得我们不能直接比较lambda表达式和匿名类,因为主要的区别是概念匿名类和函数接口没有联系,而lambda表达式严格处理函数接口。所以匿名类可以有任意数量的方法,但lambda表达式只能定义单个方法。我说得对吗?

共有1个答案

东郭淇
2023-03-14

对于问题1,是的,你可以在日常生活中这样定义它。但实际上,lambda表达式是旧方法的语法糖。请参阅此链接。lambda的主体被转换为静态方法,并且有一条invokedynamic指令。

就我而言,对于问题2,“lambda”在本文中只是“lambda表达式”的缩写。你不想在谈话中用这么长的词,对吗?在其他语境中,“lambda”可以指希腊字母λ。

对于问题3,我会说lambda表达式是在您需要函数式接口时编写匿名类的替代方案。在高级抽象层面上,它们都可以表示函数式接口的实例。但是如果您需要抽象类或非函数式接口的实例,那么lambda就不能使用。

 类似资料:
  • 对于定义一个简单的函数, Python 还提供了另外一种方法,即使用本节介绍的 lambda 表达式。 lambda 表达式,又称 匿名函数,常用来表示内部仅包含 1 行表达式的函数。如果一个函数的函数体仅有 1 行表达式,则该函数就可以用 lambda 表达式来代替。 lambda 表达式的语法格式如下: name = lambda [list] : 表达式 其中,定义 lambda 表达式,必

  • 匿名函数   在Go中函数也是值,程序中可以声明一个函数类型的变量,将函数作为参数传递。声明函数为值的变量(匿名函数:可赋值个变量,也可直接执行) pro04_1_2_1.go package main import ( "fmt" ) //求矩形的面积 func main() { myfun := func(x int, y int) int { retur

  • 我在JavaFX上有一个应用程序。在这个应用程序中,我需要实现专栏的编辑器。在旧版本中,该代码运行良好: 但是当我试图用lambda重写代码时 我得到一个错误:错误:java:不兼容的类型:lambda表达式中的不兼容参数类型告诉我如何指定lambda表达式的类型?

  • 编译工作正常,但在运行时应用程序崩溃,出现以下错误:。 和缺少了什么?

  • 我正在尝试将Java 1.8与lambda表达式一起使用,其中包含Idea UI Designer,我在maven中有: 和依赖关系 当我尝试使用lambdas时,它返回编译错误: 您对如何将lambdas与Idea UI Designer一起使用有何想法?

  • 本文向大家介绍python lambda表达式(匿名函数)写法解析,包括了python lambda表达式(匿名函数)写法解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了python lambda表达式(匿名函数)写法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 还有很多写法: ##lambda只能用一行表示,不能自己创建表