packageorg.example;importjava.util.ArrayList;importjava.util.List;enumColor{RED,GREEN,YELLOW}classApple{privateInteger weight;privateColor color;publicApple(Integer weight,Color color){this.weight = weight;this.color = color;}publicIntegergetWeight(){return weight;}publicvoidsetWeight(Integer weight){this.weight = weight;}publicColorgetColor(){return color;}publicvoidsetColor(Color color){this.color = color;}}interfaceApplePredicate{booleantest(Apple apple);}classAppleGreenColorPredicateimplementsApplePredicate{// 选择绿色苹果的谓词@Overridepublicbooleantest(Apple apple){returnColor.GREEN.equals(apple.getColor());}}classAppleHeavyWeightPredicateimplementsApplePredicate{// 选择重量大于150克的谓词@Overridepublicbooleantest(Apple apple){return apple.getWeight()>150;}}publicclassMain{publicstaticList<Apple>filterApples(List<Apple> inventory,ApplePredicate p){// 通过谓词筛选苹果List<Apple> result =newArrayList<>();for(Apple apple :
inventory){if(p.test(apple)){
result.add(apple);}}return result;}publicstaticvoidmain(String[] args){List<Apple> inventory =newArrayList<>();
inventory.add(newApple(300,Color.RED));
inventory.add(newApple(12,Color.RED));
inventory.add(newApple(350,Color.GREEN));
inventory.add(newApple(200,Color.YELLOW));// 方便的筛选绿色苹果和重苹果List<Apple> result =filterApples(inventory,newAppleGreenColorPredicate());
result =filterApples(result,newAppleHeavyWeightPredicate());for(var apple :
result){System.out.println(apple.getColor()+":"+ apple.getWeight());}}}
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
2,上述定义接口实现的方式过于啰嗦和繁杂可以使用匿名类和lamble表达式进行简化
2.1, 匿名内部类
List<Apple> result =filterApples(inventory,newApplePredicate(){@Overridepublicbooleantest(Apple apple){returnColor.GREEN.equals(apple.getColor());}});
result =filterApples(inventory,newApplePredicate(){@Overridepublicbooleantest(Apple apple){return apple.getWeight()>150;}});
1
2
3
4
5
6
7
8
9
10
11
12
13
2.2 lamble表达式
List<Apple> result =filterApples(inventory,(Apple apple)->apple.getColor().equals(Color.GREEN));
result =filterApples(result,(Apple apple)->apple.getWeight()>150);
1
2
3,更进一步的可以将针对苹果的list类型进行抽象化,用于其他的水果
interfacePredicate<T>{booleantest(T t);}publicstatic<T>List<T>filter(List<T> inventory,Predicate<T> p){// 通过谓词筛选TList<T> result =newArrayList<>();for(T e :
inventory){if(p.test(e)){
result.add(e);}}return result;}