1, 通过定义不同的谓词接口来区分不同的苹果的重量,如果后续有更多的需求,只需要添加更多的谓词即可
- package org.example;
- import java.util.ArrayList;
- import java.util.List;
- enum Color {
- RED, GREEN, YELLOW
- }
- class Apple {
- private Integer weight;
- private Color color;
- public Apple(Integer weight, Color color) {
- this.weight = weight;
- this.color = color;
- }
- public Integer getWeight() {
- return weight;
- }
- public void setWeight(Integer weight) {
- this.weight = weight;
- }
- public Color getColor() {
- return color;
- }
- public void setColor(Color color) {
- this.color = color;
- }
- }
- interface ApplePredicate {
- boolean test(Apple apple);
- }
- class AppleGreenColorPredicate implements ApplePredicate {
- // 选择绿色苹果的谓词
- @Override
- public boolean test(Apple apple) {
- return Color.GREEN.equals(apple.getColor());
- }
- }
- class AppleHeavyWeightPredicate implements ApplePredicate {
- // 选择重量大于150克的谓词
- @Override
- public boolean test(Apple apple) {
- return apple.getWeight() > 150;
- }
- }
- public class Main {
- public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p) {
- // 通过谓词筛选苹果
- List<Apple> result = new ArrayList<>();
- for (Apple apple :
- inventory) {
- if (p.test(apple)) {
- result.add(apple);
- }
- }
- return result;
- }
- public static void main(String[] args) {
- List<Apple> inventory = new ArrayList<>();
- inventory.add(new Apple(300,Color.RED));
- inventory.add(new Apple(12,Color.RED));
- inventory.add(new Apple(350,Color.GREEN));
- inventory.add(new Apple(200,Color.YELLOW));
- // 方便的筛选绿色苹果和重苹果
- List<Apple> result = filterApples(inventory, new AppleGreenColorPredicate());
- result = filterApples(result, new AppleHeavyWeightPredicate());
- for (var apple :
- result) {
- System.out.println(apple.getColor() + ":" + apple.getWeight());
- }
- }
- }
复制代码 2,上述定义接口实现的方式过于啰嗦和繁杂可以使用匿名类和lamble表达式进行简化
2.1, 匿名内部类
- List<Apple> result = filterApples(inventory, new ApplePredicate() {
- @Override
- public boolean test(Apple apple) {
- return Color.GREEN.equals(apple.getColor());
- }
- });
- result = filterApples(inventory, new ApplePredicate() {
- @Override
- public boolean test(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类型进行抽象化,用于其他的水果
- interface Predicate <T>{
- boolean test(T t);
- }
- public static <T> List<T> filter(List<T> inventory, Predicate<T> p) {
- // 通过谓词筛选T
- List<T> result = new ArrayList<>();
- for (T e :
- inventory) {
- if (p.test(e)) {
- result.add(e);
- }
- }
- return result;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |