java 通过行为参数化传递代码,来解决不断增长的需求

1, 通过定义不同的谓词接口来区分不同的苹果的重量,如果后续有更多的需求,只需要添加更多的谓词即可

java 复制代码
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, 匿名内部类
java 复制代码
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表达式
java 复制代码
List<Apple> result = filterApples(inventory, (Apple apple)->apple.getColor().equals(Color.GREEN));
result = filterApples(result, (Apple apple)->apple.getWeight()>150);

3,更进一步的可以将针对苹果的list类型进行抽象化,用于其他的水果

java 复制代码
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;
}
相关推荐
我不是懒洋洋6 分钟前
【经典题目】栈和队列面试题(括号匹配问题、用队列实现栈、设计循环队列、用栈实现队列)
c语言·开发语言·数据结构·算法·leetcode·链表·ecmascript
枫叶丹47 分钟前
【HarmonyOS 6.0】ArkWeb PDF浏览能力增强:指定PDF文档背景色功能详解
开发语言·华为·pdf·harmonyos
谭欣辰9 分钟前
C++ 控制台跑酷小游戏2.0
开发语言·c++·游戏程序
Huangxy__14 分钟前
java相机手搓(后续是文件保存以及接入大模型)
java·开发语言·数码相机
刚子编程18 分钟前
C#事务处理最佳实践:别再让“主表存了、明细丢了”的破事发生
开发语言·c#·事务处理·trycatch
lsx20240623 分钟前
jEasyUI 自定义对话框
开发语言
陶然同学28 分钟前
【Python】文件操作
开发语言·python
来自远方的老作者35 分钟前
第10章 面向对象-10.3 封装
开发语言·python·私有属性·私有方法·封装
j_xxx404_38 分钟前
用系统调用从零封装一个C语言标准I/O库 | 附源码
linux·c语言·开发语言·后端
并不喜欢吃鱼40 分钟前
从零开始C++----七.继承相关模型,解析多继承与菱形继承问题(下篇)
开发语言·c++