JDK8-1-Lambda表达式(2)-方法传递

JDK8-1-Lambda表达式(2)-方法传递

Java 8 允许程序将方法作为参数传递,先看一个例子:

苹果实体类:

public class Apple {
    //颜色
    private String color;
    //重量,单位克,150克到400克
    private double weight;

    public Apple(String color, double weight) {
        this.color = color;
        this.weight = weight;
    }
	//get set 方法省略。。。
}

以下,filterGreenApples ,filterHeavyApples 方法分别表示过滤出不同类型的苹果

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

public class AppleFilterTest {

    private static final List apples = Arrays.asList(
            new Apple("red", 400), new Apple("green", 300),
            new Apple("yellow", 100), new Apple("green", 200)
    );

    /**
     * 过滤出绿色的苹果
     * @param inventory
     * @return
     */
    public static List filterGreenApples(List inventory) {
        List result = new ArrayList<>();
        for (Apple apple : inventory) {
            if ("green".equals(apple.getColor())) {
                result.add(apple);
            }
        }
        return result;
    }

    /**
     * 过滤出重苹果
     * @param inventory
     * @return
     */
    public static List filterHeavyApples(List inventory) {
        List result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (apple.getWeight() > 150) {
                result.add(apple);
            }
        }
        return result;
    }

    public static void main(String[] args) {
        List greenApples = filterGreenApples(apples);
        System.out.println(greenApples);

        List heavyApples = filterHeavyApples(apples);
        System.out.println(heavyApples);
    }

}

从代码中可以看出,filterGreenApples 与 filterHeavyApples 方法代码几乎一模一样,仅仅只有 if 条件中的代码有区别,既然这样为什么不可以将筛选的代码抽出,过滤的部分作为公共逻辑呢
改造的部分为:

"green".equals(apple.getColor())
apple.getWeight() > 150

这两个条件都与 Apple apple 这个对象关联,可以将是否满足条件封装成一个接口,Apple apple 作为参数传入,接口定义如下:
为了更加通用,所以定义成泛型,不过实际工作中不用自己定义,因为JDK8已经有了,具体路径为:
java.util.function.Predicate

public interface Predicate {
    boolean test(T t);
}

filterGreenApples,filterHeavyApples 可以统一用一个方法 filterApples 代替,只要将条件参数传入即可,filterApples 方法如下,其中 predicate 为条件,if 条件中只需调用 predicate test 方法,成功表示满足条件:

public static List filterApples(List inventory, Predicate predicate) {
    List result = new ArrayList<>();
    for (Apple apple : inventory) {
        if (predicate.test(apple)) {
            result.add(apple);
        }
    }
    return result;
}

调用方式:

List greenApples = filterApples(apples, apple -> "green".equals(apple.getColor()));
List heavyApples = filterApples(apples, apple -> apple.getWeight() > 150);

实际工作使用

在实际工作中我们根本不用定义 filterApples 这个方法,因为JDK已经提供 filter 方法,实际使用如下:
这里使用了JDK8的新特性 Stream API

List greenApples = apples.stream()
                .filter(apple -> "green".equals(apple.getColor()))
                .collect(Collectors.toList());

List heavyApples = apples.stream()
      			.filter(apple -> apple.getWeight() > 150)
      			.collect(Collectors.toList());

filter 方法接收 java.util.function.Predicate 类型

Stream filter(Predicate predicate);

你可能感兴趣的:(JavaSE,java,jvm,servlet)