Java8新特性系列一:行为参数化
Posted five five open
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java8新特性系列一:行为参数化相关的知识,希望对你有一定的参考价值。
1. 什么是行为参数化
行为参数化主要是为了应对需求的变化,减少代码的变动冗余、变动,应对行为标准建模,方式可以为定义接口,下面以一个例子说明行为参数化的必要性
2. 需求一
有一个Apple类,属性包括颜色、重量等,现在用户需求为:筛选出苹果重量>100的苹果,这个需求很简单,很容易想到的实现如下:
package lambdasinaction.chap1; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @Author oxygen * @Date 2020/7/20 0020 * @Version V1.0 **/ public class MyFilterApple { public static void main(String[] args) { List<Apple> inventory = Arrays.asList(new Apple(100, "red"), new Apple(180, "green")); List<Apple> apple = findWeightGH100Apple(inventory); } private static List<Apple> findWeightGH100Apple(List<Apple> inventory) { List<Apple> result = new ArrayList<>(); for (Apple apple : inventory) { if (apple.getWeight() > 100) { result.add(apple); } } return result; } public static class Apple { private int weight = 0; private String color = ""; public Apple(int weight, String color) { this.weight = weight; this.color = color; } public void setMethod&getMethod(...) } }
2. 需求二
用户改变增加需求:
筛选出重量>100而且颜色为red的苹果,很容易想到的实现为增加一个实现方法,但是随着需求的增加,会增加N多筛选的方法,同时冗余代码
private static List<Apple> findWeightGH100Apple(List<Apple> inventory) { List<Apple> result = new ArrayList<>(); for (Apple apple : inventory) { if (apple.getWeight()>100 && "green".equals(apple.getColor())){ result.add(apple); } } }
3. 改进一
3.1 定义接口传递行为
public interface ApplePredicate { boolean test(Apple apple); }
3.2 多个类实现具体的逻辑
/** *过滤重量大于100而且颜色是红色的苹果 */ public class AppleColorPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { return "red".equals(apple.getColor()) && apple.getWeight() > 100; } } /** * 过滤重量>150的苹果 */ public class AppleHeavyWeightPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { return apple.getWeight() > 150; } }
3.3 定义实现方法
List<Apple> inventory = Arrays.asList(new Apple(100, "red"), new Apple(180, "green")); MyFilterApple.AppleColorPredicate p = new MyFilterApple().new AppleColorPredicate(); List<Apple> apples = filterApples(inventory, p); MyFilterApple.AppleHeavyWeightPredicate p2 = new MyFilterApple().new AppleHeavyWeightPredicate(); List<Apple> apples1 = filterApples(inventory, p2); private 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;
}
3. 改进二
filterApples方法只能接受对象,所以必须把代码包裹在ApplePredicate对象里,因为通过一个实现了test方法的对象来传递布尔表达式
可用匿名内部类和Lambd改进
List<Apple> apples3 = filterApples(inventory, new ApplePredicate() {//匿名内部类优化 @Override public boolean test(Apple apple) { return apple.getWeight() > 150; } }); List<Apple> apples3 = filterApples(inventory, apple -> apple.getWeight() > 100);//Lambda表达式优化
以上是关于Java8新特性系列一:行为参数化的主要内容,如果未能解决你的问题,请参考以下文章