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新特性系列一:行为参数化的主要内容,如果未能解决你的问题,请参考以下文章

侠说java8-行为参数化(开山篇)

公子奇带你一步一步了解Java8中行为参数化

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

Java8新特性 Lambda

java8新特性之Lambda表达式入门

行为参数化与lambda表达式 - 读《Java 8实战》