Lambda表达式和匿名内部类

Java8由匿名内部类到lambda表达式的转换,除了具体的语法外,二者之间真正的差别是什么。事实上,lambda表达式有时被错误地称为匿名内部类的“语法糖”,这说的只是二者之间只存在简单的语法上的变化。但实际上,二者之间存在很多显著差异,其中有两点对于程序员来说非常重要:

(1) 匿名内部类表达式会确保创建一个拥有唯一标识的新对象,而lambda表达式的计算机结果可能有,也可能没有唯一标识,这取决于具体实现。相对于对应的内部类来说,这种灵活性可以让平台使用更为高效的实现策略。
(2) 内部类的声明会创建一个新的命名作用域,在这个作用域中,this与super指的是内部类本身的当前实例;相反,lambda表达式并不会引入任何新的命名环境。这样就避免了内部类名称查找的复杂性,名称查找会导致很多小错误,例如想要调用外围实例方法时却错误地调用了内部类实例的Object方法。


1 . 无标识性问题 
到目前为止,Java程序的行为总是与对象相关联,以标识,状态和行为为特征。lambda则违背了该规则;虽然它们会共享一些对象的属性,但唯一的用处是表示行为。由于没有状态,因此标识问题就不重要了。语言规范显式表示其是未确定的,唯一的要求就是lambda必须计算出实现了恰当函数式接口的类实例。这么做的意图是赋予平台足够的灵活性来进行优化,如果每个lambda表达式都要拥有唯一标识,那么这种灵活性无法实现。

2 . lambda的作用域规则 
就像大多数内部类一样,匿名内部类的作用域规则非常复杂,这是因为它可以引用从父类型继承下来的名字,以及声明在外部类中的名字。lambda表达式则要简单得多,因为它们并不会从父类型中继承名字(这个规则会将父类型(也就是函数接口)中声明的任何名字排除在lambda作用域之外。除了抽象方法之外,接口可以申明静态的final字段、静态嵌套类以及默认方法。它们都不在实现的lambda的作用域之内)。除了参数以外,用在lambda表达式体中的名字的含义与体外面是一样的。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值