Lambda表达式和匿名内部类的区别
所需类型不同:
匿名内部类:可以是抽象类,可以是接口,也可以是具体类
Lambda表达式:只可以是接口
使用限制不同:
如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中的抽象方法不止一个,就只能使用匿名内部类,不能使用Lambda表达式
实现原理不同:
匿名内部类在编译之后会产生一个单独的.class字节码文件
Lambda表达式在编译之后不会产生一个单独的.class字节码文件,对应的字节码会在运行的时候动态生成
package com.czie.iot1913.Java8.Lambda.LambdaTest02;
/**
* FileName: LambdaDemo
* Author: lps
* Date: 2022/4/3 21:49
* Sign:刘品水 Q:1944900433
*
* @author lps
*/
public class LambdaDemo {
public static void main(String[] args) {
//匿名内部类
/* useInter(new Inter() {
@Override
public void show() {
System.out.println("接口 匿名内部类");
}
});
useStudent(new Student(){
@Override
public void study() {
System.out.println("具体类 匿名内部类");
}
});
useAnimal(new Animal() {
@Override
public void method() {
System.out.println("抽象类 匿名内部类");
}
});*/
useInter(new Inter() {
@Override
public void show() {
System.out.println("接口 匿名内部类");
}
});
//Lambda表达式
// useInter(()-> System.out.println("Lambda 接口类"));
//useStudent(()-> System.out.println("Lambda 具体类"));
//Target type of a lambda conversion must be an interface lambda转换的目标类型必须是接口
//useAnimal(()-> System.out.println("Lambda 抽象类"));
//lambda转换的目标类型必须是接口
// useInter(new Inter() {
// @Override
// public void show() {
// System.out.println("哈哈嗨");
// }
//
// @Override
// public void show1() {
// System.out.println("鸡汤来了");
// }
// });
}
//抽象类
private static void useAnimal(Animal a) {
a.method();
}
//具体类
private static void useStudent(Student s) {
s.study();
}
//接口
private static void useInter(Inter i) {
i.show();
//i.show1();
}
}
package com.czie.iot1913.Java8.Lambda.LambdaTest02;
/**
* FileName: Inter
* Author: lps
* Date: 2022/4/3 21:49
* Sign:刘品水 Q:1944900433
*/
public interface Inter {
void show();
// void show1();
}
package com.czie.iot1913.Java8.Lambda.LambdaTest02;
/**
* FileName: Student
* Author: lps
* Date: 2022/4/3 21:49
* Sign:刘品水 Q:1944900433
*/
public class Student{
public void study(){
System.out.println("爱生活,爱自己");
}
}
package com.czie.iot1913.Java8.Lambda.LambdaTest02;
/**
* FileName: Animal
* Author: lps
* Date: 2022/4/3 21:49
* Sign:刘品水 Q:1944900433
*/
public abstract class Animal {
public abstract void method();
}