Lambda表达式并不是匿名内部类的“语法糖”。
语法糖:代码的写法更加简便,但其实原理不变。
例如:
- 方法当中的可变参数,底层仍然是一个数组
- 增强for循环用于java.lang.Iterable实现类型时,底层仍然是一个迭代器
- 自动装箱、自动拆箱
但是!Lambda表达式和匿名内部类存在根本区别,不是语法糖!
-
所需的类型不一样:
如果是匿名内部类,那么可以用接口、还可以用抽象类、甚至可以是普通的类。
如果是Lambda表达式,那么必须是接口。 -
使用的限制不同:
如果接口当中有且仅有一个抽象方法,那么可以使用Lambda表达式,也可以使用匿名内部类。
但是如果接口当中抽象方法不唯一,那么只能使用匿名内部类,不能使用Lambda表达式了。 -
实现原理也不同:
匿名内部类:其实就是一个类,编译之后,直接产生一个单独的.class字节码文件。
Lambda表达式:编译之后,没有单独的.class字节码文件;对应的字节码会在运行的时候才会动态生成。