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();
}

 

 

posted @ 2022-04-03 22:29  刘品水  阅读(96)  评论(0编辑  收藏  举报