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());}}}
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;}});
2.2 lamble表达式
List<Apple> result =filterApples(inventory,(Apple apple)->apple.getColor().equals(Color.GREEN));
result =filterApples(result,(Apple apple)->apple.getWeight()>150);
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;}
/ 选择绿色苹果的谓词 @Override public boolean test(Apple apple) {// 选择重量大于150克的谓词 @Override public boolean test(Apple apple) {// 通过谓词筛选苹果 List < Apple > result = new ArrayList < >();