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

时间:2018-10-29 14:27:21

标签: java lambda closures anonymous-function anonymous-inner-class

我已经阅读了很多有关lambda的文章。但是他们是微妙的疑问:

  

第一季度。 lambda表达式的定义。

  1. 我在oracle page上找不到清晰的定义。
  2. This link说:“因此,Java lambda表达式是一种可以创建的函数,而不必属于任何类。”
  3. This link说:“ Lambda Expression是可以传递的匿名函数的简洁表示。”
  4. This link说:“ Lambda表达式基本上表示功能接口的实例”

第2和第3链接未提及功能接口。第四个链接听起来有些不错,但没有提及lambda表达式的“匿名”方面。我们可以这样更完美地定义它们吗:

  

Lambda 表达式是“语法上简洁的表达式,用于定义功能接口的匿名实现”。

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

  

第二季度。我们可以区分lambda和lambda表达式吗?

我觉得有区别,因为可以使用lambda表达式来定义无状态的lambda和有状态的闭包(即外部词法范围内的访问变量)。似乎,这就是为什么oracle链接不使用“表达式”而不使用单词“ lambda”的原因。但是其他链接不是这种情况。

  

第三季度。 This link使用lambda表达式表示,“我们不需要像编写匿名类那样编写很多样板文件。”现在听起来就像“ Lambda表达式就像匿名类一样,”,“我们不需要像编写匿名类那样编写很多样板。”我觉得我们无法直接将lambda表达式与匿名类进行比较,因为主要区别在于概念匿名类与功能接口没有关系,而lambda表达式严格处理功能接口。因此,匿名类可以具有任意数量的方法,但是lambda表达式只能定义单个方法。这样对吗?

1 个答案:

答案 0 :(得分:0)

对于问题1,是的,您可以将其定义为日常用途。但实际上,lambda表达式是好的旧方法的语法糖。参见此link。 Lambda的主体转换为静态方法,并且有一条invokedynamic指令。

对于问题2,就我而言,“ lambda”在此上下文中仅是“ lambda表达式”的缩写。您不想在对话中说那么长的话,对吗?在其他情况下,“ lambda”可以指希腊字母λ。

对于问题3,我想说当需要功能接口时,lambda表达式可以替代编写匿名类的方法。在较高的抽象水平上,它们都可以表示功能接口的实例。但是,如果您需要抽象类或非功能接口的实例,则不能使用lambda。