-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTestLambda.java
More file actions
144 lines (124 loc) · 4.77 KB
/
TestLambda.java
File metadata and controls
144 lines (124 loc) · 4.77 KB
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
package Java8Study.lambda1;
import org.junit.Test;
import java.util.*;
public class TestLambda {
//原来的匿名内部类
@Test
public void test1(){
Comparator<Integer> cmp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
//可以在其他集合类中使用新定义的cmp比较器了
TreeSet<Integer> set = new TreeSet<>(cmp);
}
//Lambda 表达式
@Test
public void test2(){
Comparator<Integer> cmp = (x, y) ->Integer.compare(x, y);
TreeSet<Integer> set = new TreeSet<>(cmp);
}
List<Employee> employees = Arrays.asList(
new Employee("jerry",18,9999.1),
new Employee("tom",23,1234),
new Employee("jack",38,4214),
new Employee("pony",45,12442.1),
new Employee("tony",50,1232)
);
//下面来看几个需求:
//需求:获取公司中员工年龄大于35的所有员工信息
public List<Employee> filterEmployeesByAge(List<Employee> employees){
List<Employee> filterEmployees = new ArrayList<>();
for (Employee employee : employees) {
if(employee.getAge()>35){
filterEmployees.add(employee);
}
}
return filterEmployees;
}
//需求:获取公司中员工工资大于 5000 的员工信息
public List<Employee> filterEmployeesBySalary(List<Employee> employees){
List<Employee> filterEmployees = new ArrayList<>();
for(Employee employee : employees) {
if(employee.getSalary()>5000){
filterEmployees.add(employee);
}
}
return filterEmployees;
}
//测试
@Test
public void test3(){
List<Employee> filterEmployees = filterEmployeesByAge(employees);
for(Employee employee : filterEmployees){
System.out.println(employee);
}
}
// ---------------------------------------------
// |以上的问题:需求的实现方式重复较多,造成大段代码重复 |
// ---------------------------------------------
//解决1:采用实现接口 MyPredicate的方式,有几种过滤方法就实现几次接口,即策略模式
//需求:获取公司中员工年龄大于35的所有员工信息
public List<Employee> filterEmployeesByAge(List<Employee> employees, MyPredicate<Employee> myPredicate){
List<Employee> filterEmployees = new ArrayList<>();
for(Employee employee : employees){
if(myPredicate.test(employee)){
filterEmployees.add(employee);
}
}
return filterEmployees;
}
@Test
public void test4(){
List<Employee> filterEmployeesByAge = filterEmployeesByAge(employees, new AgeFilter());
System.out.println("Filter By Age:");
for(Employee employee : filterEmployeesByAge){
System.out.println(employee);
}
System.out.println("-----------------------------------------------------------------");
System.out.println("Filter By Salary:");
List<Employee> filterEmployeesBySalary = filterEmployeesByAge(employees, new SalaryFilter());
for(Employee employee : filterEmployeesBySalary){
System.out.println(employee);
}
}
//实现时只需要一种方法,即只需要一个employee列表和一个过滤器对象即可,但是实现类可能会过多
//解决2:匿名内部类
@Test
public void test5(){
List<Employee> filterEmployeesByAge = filterEmployeesByAge(employees, new MyPredicate<Employee>() {
@Override
public boolean test(Employee employee) {
return employee.getAge()>35;
}
});
System.out.println("Filter By Age:");
for(Employee employee : filterEmployeesByAge){
System.out.println(employee);
}
}
//解决3:lambda表达式
@Test
public void test6(){
List<Employee> filterEmployeesByAge = filterEmployeesByAge(employees, e -> e.getAge() >35);
filterEmployeesByAge.forEach(System.out::println);
}
//解决4:以上接口,实现类都不存在时,使用Stream API
@Test
public void test7(){
//所有年龄大于35的
employees.stream()
.filter(e -> e.getAge() >35)
.forEach(System.out::println);
//所有薪资大于5000的
employees.stream()
.filter(e -> e.getSalary() > 5000)
.forEach(System.out::println);
//打印出每个对象的名字
employees.stream()
.map(Employee::getName)
.forEach(System.out::println);
}
}