1、所需类型和使用限制不同
匿名内部类:有任意数量抽象方法的接口 / 抽象类 / 具体类
Lambda表达式:有且仅有一个抽象方法的接口(函数式接口)
2、实现原理不同
匿名内部类:编译之后,会产生一个单独的新的.class字节码文件;
Lambda表达式:编译之后,没有单独的.class字节码文件,对应的字节码会在运行时动态生成
EatableDemo.java
package h220331;
public class EatableDemo {
public static void main(String[] args) {
//lambad表达式:接口中有且只有一个抽象方法
//无参
/* useEatable(()->{
System.out.println("吃饭");
});*/
//带参
/* useFlyable(s -> System.out.println(s);,"我服了");*/
//带返回值
int res = useAddable((a, b) -> {
return a + b;
}, 10, 20);
}
private static void useEatable(Eatable e) {
e.eat();
}
private static void useFlyable(Flyable f, String s) {
f.flyable("你好");
}
private static int useAddable(Addable a, int x, int y) {
int sum = a.addable(x, y);
return sum;
}
}
Addable.java
public interface Addable {
int addable(int x,int y);
}
Eatable.java
public interface Eatable {
void eat();
}
Flyable.java
public interface Flyable {
void flyable(String s);
}