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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* Lambda表达式的使用
*
* 1.举例: (o1,o2) -> Integer.compare(o1,o2);
*
* 2. 格式:
* ->: lambda操作符 或者箭头操作符
* ->左边: lambda形参列表(其实就是接口中抽象方法的形参列表)
* ->右边: lambda体(其实就是重写的抽象方法的方法体)
*
* 3.Lambda表达式的使用:(6种情况)
* -> (1) 无参无返回值
* -> (2) 需要一个参数无返回值
* -> (3) 类型推断,数据类型可以由编译器推断而出,可以省略
* -> (4) Lambda如果只需要一个参数,参数的小括号可以省略
* -> (5) Lambda需要两个或两个以上个参数,多条执行语句,并且可以有返回值
* -> (6) Lambda体只有一条语句时,如果有return和大括号,则都可以省略
* 总结:
* ->左边:Lambda形参列表的参数类型可以省略(类型推断);如果Lambda形参列表只有一个参数,则小括号也可以省略
* ->右边:Lambda体应该使用一对{}包括;如果Lambda体只有一条执行语句(可能是return语句),可以省略return和{}
* 4.Lambda表达式的本质:作为函数式接口的实例
*
* 5.如果一个接口中只声明了抽象方法,则称改接口为函数式接口。
* 可以在一个接口上使用@FunctionalInterface注解来检查它是否是一个函数式接口
*
* 6.以前用匿名实现类表示的现在都可以用Lambda表达式来写
*
* */

import org.junit.Test;

import java.util.Comparator;
import java.util.function.Consumer;

public class LambdaTest {

//=================================================================//
@Test
//无参无返回值
public void test1() {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("我爱北京天安门");
}
};

r1.run();

System.out.println("==============================");

Runnable r2 = () -> System.out.println("我爱北京故宫");

r2.run();
}
//=================================================================//
@Test
//需要一个参数无返回值
public void test2() {
Consumer<String> con = new Consumer<String>(){

@Override
public void accept(String s) {
System.out.println(s);
}
};
con.accept("谎言和誓言的区别是什么?");

System.out.println("==============================");

Consumer<String> con2 = (String s) ->{
System.out.println(s);
};

con2.accept("一个是听的人当真了,一个是说的人当真了");

}

//=================================================================//
@Test
//类型推断,数据类型可以由编译器推断而出,可以省略
public void test3() {

System.out.println("==============================");

Consumer<String> con2 = (s) ->{
System.out.println(s);
};

con2.accept("一个是听的人当真了,一个是说的人当真了");
}

//=================================================================//
@Test
//Lambda如果只需要一个参数,参数的小括号可以省略
public void test4() {

System.out.println("==============================");

Consumer<String> con2 = s ->{
System.out.println(s);
};

con2.accept("一个是听的人当真了,一个是说的人当真了");
}

//=================================================================//
@Test
//Lambda需要两个或两个以上个参数,多条执行语句,并且可以有返回值
public void test5() {
Comparator<Integer> com1 = new Comparator<Integer>(){
@Override
public int compare(Integer o1, Integer o2) {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
}
};

System.out.println(com1.compare(12,21));

System.out.println("==============================");

Comparator<Integer> com2 = (o1,o2) -> {
System.out.println(o1);
System.out.println(o2);
return o1.compareTo(o2);
};

System.out.println(com2.compare(66,55));
}

//=================================================================//
@Test
//Lambda体只有一条语句时,如果有return和大括号,则都可以省略
public void test6() {
Comparator<Integer> com2 = (o1,o2) -> o1.compareTo(o2);
System.out.println(com2.compare(66,55));

Runnable r2 = () -> System.out.println("我爱北京故宫");

r2.run();
}

}