6.8.4 Lambda表达式与匿名内部类的联系和区别
Lambda
表达式是匿名内部类的一种简化,因此它可以部分取代匿名内部类的作用, Lambda
表达式与匿名内部类存在如下相同点。
Lambda
表达式与匿名内部类
一样,都可以直接访问"effectively final"
的局部变量,以及外部类的成员变量
(包括实例变量和类变量)
Lambda
表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| @FunctionalInterface interface Displayable { void display();
default int add(int a, int b) { return a + b; }
}
public class LambdaAndinner { private int age = 12; private static String name = "Hello";
public void test() { String book = "World"; Displayable displayable = () -> { System.out.println("当前方法 局部变量 book=" + book); System.out.println("外部类 类变量 name=" + name); System.out.println("外部类 实例变量 age=" + age); }; displayable.display(); displayable.add(3, 5); }
public static void main(String[] args) { LambdaAndinner lambdaAndinner = new LambdaAndinner(); lambdaAndinner.test(); } }
|
Lambda
表达式的代码块
与匿名内部类的方法体
是相同的。
- 与匿名内部类相似的是,由于
Lambda
表达式访问了book
局部变量,因此该局部变量
相当于有隐式的final
修饰,因此同样不允许对book
局部变量重新赋值。
- 程序使用
Lambda
表达式创建的对象不仅可调用接口中唯一的抽象方法,也可调用接口中的默认方法。
Lambda表达式和匿名内部类的区别
Lambda
表达式与匿名内部类主要存在如下区别。
- 匿名内部类可以为任意接口创建实例,不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可;但
Lambda
表达式只能为函数式接口创建实例
- 匿名内部类可以为
抽象类
甚至普通类
创建实例;但Lambda
表达式只能为函数式接口创建实例。
- 匿名内部类实现的抽象方法的
方法体
中允许调用接口中定义的默认方法;但Lambda
表达式的代码块
中不允许调用接口中定义的默认方法。
原文链接: 6.8.4 Lambda表达式与匿名内部类的联系和区别