Java细节–Lambda表达式与匿名内部类的联系和区别
我们知道,lambda表达式是匿名内部类的一种简化,因此它具有代替匿名内部类的作用
- 相同点
-
1.Lambda表达式与匿名内部类一样,都可以直接访问"effectively final"的局部变量,以及外部类的成员变量 (包括类变量和实例变量) 2.Lambda表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法
下面代码演示相似之处:
@FunctionalInterface
//@FunctionalInterface声明函数式接口
package test;
@FunctionalInterface
//@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 say="Java,世界第一编程语言";
public void test(){
String msg="我爱Java";
Displayable dis=()->{
System.out.println("msg局部变量为:"+msg);
System.out.println("外部类的age实例变量为:"+age);
System.out.println("外部类的say类变量为:"+say);
};
dis.display();
System.out.println(dis.add(3,5));
}
public static void main(String []args){
//var变量是jdk10的新特性,如果jdk小于这个版本将var换成LambdaAndInner
var lambda=new LambdaAndInner();
lambda.test();
}
}
- 区别
-
1.匿名内部类可以为任意接口创建实例--不管接口包含多少个抽象方法,只要匿名内部类实现所有的抽象方法即可 Lambda只能为函数时接口创建实例 2.匿名内部类可以为抽象类甚至普通类创建实例 Lambda只能为函数时接口创建实例 3.匿名内部类实现的抽象方法的方法体允许调用接口中定义的默认方法 Lambda表达式则不能 4.Lambda表达式形式上简单,便于编程
下述代码会错误
System.out.println(add(3,5));