java中的 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.yzw.test;

/**
* 1.8 Lambda表达式和匿名内部类的区别
* <p>
* 所需类型不同
* 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
* Lambda表达式:只能是接口
* <p>
* 使用限制不同
* 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
* 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
* <p>
* 实现原理不同
* 匿名内部类:编译之后,产生一个单独的.class字节码文件
* Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
*/
public class LambdaDemo {

public static void temp(useInter args) {
System.out.println(args.show());
}

public static void temp(useAbs args) {
System.out.println(args.show());
}

public static void temp(useClass args) {
System.out.println(args.show());
}

public static void main(String[] args) {
temp(new useAbs() {
@Override
int show() {
return 999;
}
});

temp(new useClass());

temp(() -> {
return 888;
});
}
}

interface useInter {
int show();
}

abstract class useAbs {
abstract int show();
}

class useClass {
public int show() {
return 777;
}
}