Java8中引入的lambda是怎么实现的呢?很多人初次使用的时候感觉很像匿名内部类,但是生成的class文件中又找不到内部类,这是怎么回事呢?
首先lambda确实很像匿名内部类,自动实现一个接口的抽象方法;其次Java内部确实也生成了一个内部类,只不过是在JVM运行时生成的。
代码编译为class文件后,lambda方法会生成一个私有静态方法,包装lambda的代码逻辑,而不是直接生成内部类;运行时需要执行lambda方法时,Java通过invokedynamic指令生成实现接口的内部类,并在实现方法中调用前边生成的私有静态方法。
那么为什么不直接在编译时生成内部类呢?这里有两个考虑:
一是生成到class文件中就不方便以后调整了,虽然现在是内部类的方式,但以后是不是可以直接访问一个没有绑定类的函数,就像golang一样。放到JVM中进行优化的时候就很方便了,不用重新编译代码,直接升级JVM即可。
二是可以减少字节码的代码量,编译的时候少生成点代码,自然打包文件的大小也会少很多,这对于存储和传输都是有益的,更小更快谁不喜欢呢。特别是Scala这种大量融合了函数式编程范式的语言。