Lambda表达式 和 匿名类对比分析

By | 2022年2月28日

Java8中的lambda 表达式看起来非常酷,那么这是否意味着我们习惯的 Anonymous 类的消亡?

匿名类更适合的场景

匿名内部类 (AIC) 可用于创建抽象类或具体类的子类。 AIC 还可以提供接口的具体实现,包括添加状态(字段)。 可以在其方法体中使用 this 来引用 AIC 的实例,因此可以在其上调用更多方法,其状态可以随时间变化等。这些都不适用于 lambda。

AIC 和 lambda 表达式之间的另一个区别是 AIC 引入了新的范围。 也就是说,名称是从 AIC 的超类和接口中解析出来的,并且可以隐藏出现在词法封闭环境中的名称。 对于 lambda,所有名称都按词法解析。

AIC 的大部分用途是提供单个函数的无状态实现,因此可以用 lambda 表达式代替,但是 AIC 的其他用途不能使用 lambda。 AIC 将继续存在。

Lambda性能优势

当Java启动应用程序时,每个类必须是加载和验证好的。

匿名类被编译器作为给定类或接口的新子类型处理,因此将为每个类生成一个新的类文件。

Lambda 在字节码生成方面有所不同,它们更高效,是使用 JDK7 附带的 invokedynamic 指令来处理的。

对于 Lambda来讲,此指令用于延迟翻译 lambda 表达式为字节程序,直到运行到的时候。 (指令只在第一次调用)

结果就是, Lambda 表达式将在第一次运行时被创建成为一个静态方法。