JAVA8之行为参数化

🎈个人公众号:🎈 :✨✨ 可为编程 ✨✨ 🍟🍟
🔑个人信条:🔑 知足知不足 有为有不为 为与不为皆为可为🌵
🍉本篇简介:🍉 本片详细说明了inux mv移动文件命令详解与替换强制覆盖多个文件使用规则和注意要点,并给出具体操作实例,如有出入还望指正。

关注公众号【可为编程】回复【面试】领取最新面试题!!!

我们要判断多个苹果里面的绿颜色和大于150g的苹果,或者说后面会加入更多的筛选条件,用if/else太显得臃肿,所以,java8提出了行为参数化,我们按照以下两步来进行行为参数化的说明,也是对自己的学习的一个总结。
处理这种问题首先要先建立一个公共的接口,这个接口里有一个方法,就是来接收所有的条件:

public interface FormatApple {
    boolean test(Apple apple);
}

然后分别建立两个实现,一个是颜色,一个是重量,可以把参数作为重写方法的主要内容。

public class ColorAppleOp implements FormatApple {
    @Override
    public boolean test(Apple apple) {
        return "green".equals(apple.getColor());
    }
}

关注公众号【可为编程】回复【面试】领取最新面试题!!!

public class WeightOp implements FormatApple {
    @Override
    public boolean test(Apple apple) {
        return Integer.parseInt(apple.getWight())>150;
    }
}

两个类里面都针对不同的条件进行判断,返回一个boolean类型的结果,我们在执行的时候就可以直接判断,那个实体对象符合条件,返回了true,然后将其放入list中返回。

	public class MainDo {
	    public static List<Apple> appleList(List<Apple> apples, FormatApple formatApple){
	        List<Apple> apples1 = new ArrayList<>();
	        for (Apple apple:apples){
	            if (formatApple.test(apple)){
	                    apples1.add(apple);
	            }
	        }
	        return apples1;
	    }
	
	    public static void main(String[] args) {
	        Apple a = new Apple();
	        a.setColor("green");
	        a.setWight("200");
	        Apple a2 = new Apple();
	        a2.setWight("100");
	        a2.setColor("green");
	        Apple a3 = new Apple();
	        a3.setColor("red");
	        a3.setWight("250");
	        List alist = new ArrayList();
	        alist.add(a);
	        alist.add(a2);
	        alist.add(a3);
	        //筛选出绿色的苹果
	        List<Apple> resultA1 = appleList(alist,new ColorAppleOp());
	        //筛选出重量大于>150g的苹果
	        List<Apple> resultA2 = appleList(alist,new WeightOp());
	        for (Apple apple: resultA1){
	            System.out.println(apple.getColor()+apple.getWight());
	        }
	        System.out.println("--------------------");
	        for (Apple apple1: resultA2){
	            System.out.println(apple1.getColor()+apple1.getWight());
	        }
	    }
	}

输出结果:

green200
green100
--------------------
green200
red250

这样我们就初步实现了行为参数化,但是这样写就会多建立很多的实现类,也是很臃肿,那么如何实现呢,接下来我们可以再优化一下下。关注公众号【可为编程】回复【面试】领取最新面试题!!!
接口这里我们用泛型来接收传过来的不同实体参数:

public interface FormatApple<T> {
    boolean test(T t);
}

然后再主要执行类中MainDo里全部修改成泛型类型:

public static <T> List<T> appleList(List<T> apples, FormatApple<T> formatApple){
        List<T> apples1 = new ArrayList<T>();
        for (T apple:apples){
            if (formatApple.test(apple)){
                    apples1.add(apple);
            }
        }
        return apples1;
    }

在筛选的代码位置,我们替换成以下代码:
这是利用Lambda表达式,真正的实现行为参数化

 List<Apple> resultA1 = appleList(alist,(Apple apple) -> "green".equals(apple.getColor()));
 List<Apple> resultA2 = appleList(alist,(Apple apple) -> Integer.parseInt(apple.getWight())>150);

当我们需要改变时,只需要传不同的实体类型就可以,不需要我们再建立多个实现类,直接一个接口,在实现类里写对应的结构方法,将接口实体作为参数传递进来,并通过泛型,扩大对不同实体的处理,将行为参数条件化:

List<Banana> resultA3 = appleList(alist,(Banana banana) -> Integer.parseInt(banana.getWeight())>150);

具体代码:

public class MainDo {
    public static <T> List<T> appleList(List<T> apples, FormatApple<T> formatApple){
        List<T> apples1 = new ArrayList<T>();
        for (T apple:apples){
            if (formatApple.test(apple)){
                    apples1.add(apple);
            }
        }
        return apples1;
    }

    public static void main(String[] args) {
        Banana a = new Banana();
        a.setColor("green");
        a.setWeight("200");
        Banana a2 = new Banana();
        a2.setWeight("100");
        a2.setColor("green");
        Apple a3 = new Apple();
        a3.setColor("red");
        a3.setWight("250");
        List alist = new ArrayList();
        alist.add(a);
        alist.add(a2);
        //筛选出绿色的苹果
        //关注公众号【可为编程】回复【面试】领取最新面试题!!!
        /*List<Apple> resultA1 = appleList(alist,new ColorAppleOp());
        //筛选出重量大于>150g的苹果
        List<Apple> resultA2 = appleList(alist,new WeightOp());*/
      /*  List<Apple> resultA1 = appleList(alist,(Apple apple) -> "green".equals(apple.getColor()));
        List<Apple> resultA2 = appleList(alist,(Apple apple) -> Integer.parseInt(apple.getWight())>150);*/
        List<Banana> resultA3 = appleList(alist,(Banana banana) -> Integer.parseInt(banana.getWeight())>150);

        for (Banana banana: resultA3){
            System.out.println(banana.getClass().toString()+""+banana.getColor()+banana.getWeight());
        }
      /*  System.out.println("--------------------");
        for (Apple apple1: resultA2){
            System.out.println(apple1.getColor()+apple1.getWight());
        }*/
    }
}

欢迎感兴趣的小伙伴一起探讨学习知识,以上是个人的一些总结分享,如有错误的地方望各位留言指出,十分感谢。觉得有用的话别忘点赞、收藏、关注,手留余香! 😗 😗 😗

这里是一个真诚的***青年技术交流QQ群:761374713***,不管你是大学生、社畜、想学习变成的其他人员,欢迎大家加入我们,一起成长,一起进步,真诚的欢迎你,不管是技术,还是人生,还是学习方法。有道无术,术亦可求,有术无道,止于术。在这里插入图片描述

欢迎大家关注【可为编程】,成长,进步,编程,技术、掌握更多知识!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可为编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值