java8学习:经过行为参数化传递代码

  • 以下一段代码请看java

    @Test
    public void test() throws Exception {
        List<Apple> list = new ArrayList<>();
        for (Apple apple : list) {
            if (apple.getWeight() > 1000){
                System.out.println("...");
            }
        }
    }
    • 这段代码再简单不过了,而且完成了该完成的判断条件,可是若是如今并非想判断重量weight了,而是须要判断color是否是红色的了,那么就只能代码复制而后改条件了,以下
    @Test
    public void test() throws Exception {
        List<Apple> list = new ArrayList<>();
        for (Apple apple : list) {
            if ("red".equals(apple.getColor())){
                System.out.println("...");
            }
        }
    }
    • 此时发现,除了更改了if条件,其余地方是没有动的,可是若是我又须要更改别的条件呢,无奈只好再次变换if条件,针对这一的状况,java8的行为参数化就能够处理频繁的变动
  • 行为参数化编程

    • 如上的筛选苹果颜色的代码,这时候我忽然想要绿色的或者彩虹色可咋办难道还要拷贝?
    public void getAppleByColor(List<Apple> apples,String color){
                for (Apple apple : apples) {
                    if (color.equals(apple.getColor())){
                        System.out.println("...");
                    }
                }
            }
    //getAppleByColor(lists,"red");     //调用
    • 上面这段代码就解决了一直变动的颜色的问题,任他来的是透明颜色都没问题,而且调用方法时,也能够清晰的看出来咱们须要的是什么苹果
    • 苹果大卖钱就多,那么若是按照重量筛选呢?代码已经给出来了,那么就是开篇的第二段代码,仔细想一下虽然解决了咱们的问题,可是是否是代码重复的太多了,而且这样的编程风格十分很差,违反了DRY(don't repeat yourself),这时候咱们就可能想到了进一步的解决办法来应对重量和颜色的不一样选择,那就是立flag,以下
public void getAppleByColor(List<Apple> apples,String color,Integer weight,boolean isColor){
    for (Apple apple : apples) {
        if ((isColor && color.equals(apple.getColor())) ||
            !isColor && weight > apple.getWeight()){
            System.out.println("...");
        }
    }
}
getAppleByColor(lists,"red",0,true);       //调用
getAppleByColor(lists,"",123,false);       //调用
  • 如上,调用简直不能再糟了,若是不让调用者看到方法的方法签名和解释,那么他确定不会知道true表明啥false表明啥,因此这种方法解决此问题是十分不可取的,那么咱们确定就须要更好的解决方案
  • 思路:创建一个接口,那么就有类去实现接口,那么每一个实现类不就表明一种行为吗?好比这样改
相关文章
相关标签/搜索