Lambda表达式通常不会改变您可以使用Java解决的问题集,但是肯定会使解决某些问题变得更加容易,这是因为我们不再使用汇编语言进行编程的原因。从程序员的工作中删除多余的任务可以使工作变得更轻松,并且可以执行您本来不会碰到的事情,而只是要产生大量的代码(手动)。
但是lambda表达式不仅节省了代码行。Lambda表达式使您可以定义 函数
,以前可以使用它们作为变通方法来解决这些问题,这就是为什么在这种情况下(但一般而言)不能替换匿名内部类的原因。
最值得注意的是,lambda表达式是独立于它们将要转换到的功能接口定义的,因此没有继承的成员可以访问,而且,它们不能访问实现该功能接口的类型的实例。在lambda表达式中,
this并且
super具有与周围环境相同的含义。同样,您不能创建新的局部变量来遮盖周围上下文的局部变量。对于定义函数的预期任务,这消除了很多错误源,但是这也意味着对于其他用例,即使实现了功能接口,也可能存在无法转换为lambda表达式的匿名内部类。
此外,该构造
new Type() { …}保证产生一个新的独特实例(new一如既往)。如果在非
static上下文中创建,匿名内部类实例始终保留对其外部实例的引用。相反,lambda表达式仅
this在需要时(即它们访问
this或为非
static成员时)捕获对的引用。它们会生成一个有意未指定身份的实例,这使实现可以在运行时决定是否重用现有实例
”)。
这些差异适用于您的示例。您的匿名内部类构造将始终产生一个新实例,也可能捕获对外部实例的引用,而您
(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName())是一个不捕获的lambda表达式,在典型实现中其结果将为单例。此外,它不会
.class在硬盘驱动器上生成文件。
考虑到语义和性能方面的差异,lambda表达式可能会改变程序员将来解决某些问题的方式,当然,这也是由于新的API包含了利用新语言功能进行功能编程的思想。另请参见[Java
8 lambda表达式和一等值。



