行为参数化

Posted 寻找风口的猪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了行为参数化相关的知识,希望对你有一定的参考价值。

行为参数话的理解:

  行为参数化有些类似策略模式,但是更精简。表面来看就是定义一个函数式接口(只定义一个抽象方法的接口),实现这个接口然后把实现类的实例当做参数加入到方法中。行为参数化可以很好的应对不断变更的需求,使代码更优雅。

下面看看示例(来自《Java8实战》)

  模拟场景:我们有个客户是苹果大王,他想要一个系统来帮助他快速的把收来的苹果进行分类然后分销的不同的地区。第一次跟他谈需求,他说他想要把重量大于5kg的苹果发往西北,把重量小于5kg的苹果发往华东。我们根据他的需求开始开发,

做到中途,苹果大王突然联系我们说需要改需求,他还想根据颜色来把苹果分来然后发往不同的区域。我们眉头一皱,还好我们可以用行为参数化的方法来改需求。否则又是浩大的工作量啊!

  步骤一:定义一个苹果类

package org.burning.sport.javase.lambda;

public class Apple {
    private int weight;
    private String color;

    public Apple(int weight, String color) {
        this.weight = weight;
        this.color = color;
    }

   setters();getters();toString();
}

 

  步骤二:定义一个函数式接口,这个接口里的抽象方法就是用来规定怎么区分苹果的,返回一个boolean值

package org.burning.sport.javase.lambda;

/**
 * 函数式接口
 */

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

  步骤三:定义两个实现类,分别是区分颜色的和区分重量的

package org.burning.sport.javase.lambda;

public class AppleColorPredicate implements ApplePredicate {
    /** 筛选出红色的苹果 */
    @Override
    public boolean test(Apple apple) {
        return "red".equals(apple.getColor());
    }
}
package org.burning.sport.javase.lambda;

public class AppleWeightPredicate implements ApplePredicate{
    /** 筛选出重量大于5kg的苹果 */
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 5;
    }
}

   步骤四:使用行为参数

package org.burning.sport.javase.lambda;

import java.util.ArrayList;
import java.util.List;

/**
 * 行为参数化示例
 */
public class LambdaTest1 {
    public static List<Apple> filterApples(List<Apple> apples, ApplePredicate predicate) {
        List<Apple> result =new ArrayList<>();
        for(Apple apple : apples) {
            if(predicate.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List<Apple> appleList = new ArrayList<>();
        appleList.add(new Apple(10, "green"));
        appleList.add(new Apple(5, "red"));
        appleList.add(new Apple(5, "green"));
        appleList.add(new Apple(10, "red"));

        //找出颜色是红色的苹果
        List<Apple> resultColor = filterApples(appleList, new AppleColorPredicate());
        System.out.println(resultColor.toString());

        //找出重量大于5的苹果
        List<Apple> resultWeight = filterApples(appleList, new AppleWeightPredicate());
        System.out.println(resultWeight.toString());
    }
}

https://gitee.com/play-happy/base-project

参考:

【1】《Java8实战》

 

以上是关于行为参数化的主要内容,如果未能解决你的问题,请参考以下文章

Java8新特性之:行为参数化传递代码

Java 8 行为参数化

《Java 8 in Action》Chapter 2:通过行为参数化传递代码

Java8-通过行为参数化传递代码

行为参数化

通过行为参数传递代码