Java8行为参数化

需求:提供一个橘子的筛选功能,可通过颜色、重量为条件

定义橘子实体:

@Getter
@Setter
public class Orange {

    private double weight;

    private String color;
}

初学者:通过定义橘子工具类来实现,如果增加属性,如果需要提供筛选功能,那么又要继续增加筛选方法

public class OrangeUtils {

    /**
     * 通过颜色筛选橘子工具类
     *
     * @param source 需要筛选的橘子
     * @param color  目标颜色
     * @return
     */
    public static List<Orange> filterOrangesbyColor(List<Orange> source, String color) {
        if (source != null && source.size() > 0 && StringUtils.hasText(color)) {
            List<Orange> result = new ArrayList<>();
            for (Orange orange : source) {
                if (color.equals(orange.getColor())) {
                    result.add(orange);
                }
            }
            return result;
        }
        return null;
    }

    /**
     * 通过重量筛选橘子
     *
     * @param source 需要筛选的橘子
     * @param weight 重量
     * @param bool   筛选符号
     * @return
     */
    public static List<Orange> filterOrangesByWeight(List<Orange> source, double weight, boolean bool) {
        List<Orange> result = new ArrayList<>();
        for (Orange orange : source) {
            if (bool && orange.getWeight() > weight) {
                result.add(orange);
            } else if (!bool && orange.getWeight() < weight) {
                result.add(orange);
            }
        }
        return result;
    }
}

进阶:

public interface OrangePredicate {
    boolean fileter(Orange orange, Object obj);
}

public class OrangeColorPredicate implements OrangePredicate {

    @Override
    public boolean fileter(Orange orange, Object obj) {
        return obj != null && StringUtils.hasText(obj.toString()) ? obj.toString().equals(orange.getColor()) : false;
    }
}

public class OrangeWeightPredicate implements OrangePredicate {

    @Override
    public boolean fileter(Orange orange, Object obj) {
        return obj != null && orange.getWeight() > (Double)obj;
    }
}

//调用
	public List<Orange> filterOranges(List<Orange> source,OrangePredicate p,Object obj){
        List<Orange> result = new ArrayList<>();
        for (Orange orange:source){
            if(p.fileter(orange, obj)){
                result.add(orange);
            }
        }
        return result;
    }

	//或者只定义策略,策略的具体实现在调用时
	public List<Orange> filterOranges(List<Orange> source){
        return filterOranges(source, new OrangePredicate() {
            @Override
            public boolean fileter(Orange orange, Object obj) {
                return orange.getWeight() > (Double) obj;
            }
        }, 100);
    }

	//Lambda初步使用:
	public List<Orange> filterOrangesFromLambda(List<Orange> source){
        List<Orange> oranges = filterOranges(source, (Orange orange, Object obj) -> (Double) obj < orange.getWeight()
                , 100);
        return oranges;
    }

通过此需求根据Java8更改为一个通用的工具:

public class FilterUtils {

    public interface Predicate<T> {
        boolean filter(T t);
    }

    public static <T> List<T> filter(List<T> list, Predicate<T> p) {
        List<T> result = new ArrayList<>();
        for (T t : list) {
            if (p.filter(t)) {
                result.add(t);
            }
        }
        return result;
    }
}

// 通过工具调用,此工具可用于其他地方重复使用
List<Orange> oranges = new ArrayList<>();
FilterUtils.filter(oranges, new FilterUtils.Predicate<Orange>() {
    @Override
    public boolean filter(Orange orange) {
        return orange.getWeight() > 100 && "green".equals(orange.getColor());
    }
});

更多文章:
点击跳转CSDN博客
点击跳转简书博客
公众号:代码小搬运
代码小搬运.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值