JDK8新特性-Predicate 接口

概述

  • JDK8 提供的函数式接口
  • 提供一个抽象方法test, 接受一个参数, 根据这个参数进行一些判断, 返回判断结果 true / false
  • 提供几个默认的default方法, and, or, negate 用于进行组合判断
  • 在流中被广泛使用

test 方法

    /**
     * 接收一个参数, 判断这个参数是否匹配某种规则, 匹配成功返回true, 匹配失败则返回false
     */
    boolean test(T t);

and 方法

    /** 
	 * default方法, 接收另外一个Predicate类型参数进行逻辑与操作
	 * 返回一个新的Predicate
	 * Predicate newPredicate = (t) -> this.test(t) && other.test(t);
     * 如果传入的Predicate为空, 会抛出空指针异常
     */
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

or 方法

    /** 
	 * default方法, 接收另外一个Predicate类型参数进行逻辑或操作
	 * 返回一个新的Predicate
	 * Predicate newPredicate = (t) -> this.test(t) || other.test(t);
     * 如果传入的Predicate为空, 会抛出空指针异常
     */
	default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

negate 方法

    /**
	 * default方法, 返回当前Predicate取反操作之后的Predicate
	 * Predicate newPredicate = (t) -> !test(t);
     */
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

isEqual 方法

    /**
     * 接收一个Object targetRef, 返回一个Predicate类型
     * 返回的Predicate的test方法是用来判断传入的参数是否等于targetRef
     * 如Predicate predicate = Predicate.isEqual("七夜雪");
     * 等同于Predicate predicate = t -> "七夜雪".equals(t);
     * 个人感觉这个方法没多大用处
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }

API 使用样例

/**
 * @author 七夜雪
 * @date 2019-01-12 10:53
 */
public class PredicateTest {

    // 辅助打印方法
    private static void print(Object obj) {
        System.out.println(obj);
    }

    public static void main(String[] args) {

        Predicate<String> predicate = item -> "七夜雪".equals(item);
        // 1. test 方法测试
        System.out.println("1---> " + predicate.test("七夜雪"));
        List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

        // 2. Predicate 返回一个List中的偶数
        // list.stream(), 表示将List作为流进行处理, filter()方法接收一个Predicate, toArray是将流转换成数组
        Object[] result = list.stream().filter(t -> t % 2 == 0).toArray();
        print("2---> " + Arrays.toString(result));

        // 3. 测试Predicate的and方法, 打印list中大于3, 小于6的数字
        Predicate<Integer> predicate1 = t -> t > 3;
        predicate1 = predicate1.and(t -> t < 6);
        result = list.stream().filter(predicate1).toArray();
        print("3---> " + Arrays.toString(result));

        // 4. 测试Predicate的or方法, 打印list中小于3或大于5的数字
        predicate1 = t -> t < 3;
        predicate1 = predicate1.or(t -> t > 5);
        result = list.stream().filter(predicate1).toArray();
        print("4---> " + Arrays.toString(result));

        // 5. 测试Predicate的negate方法, 返回list中大于等于3,小于等于5的数字, 即对场景4取反
        result = list.stream().filter(predicate1.negate()).toArray();
        print("5---> " + Arrays.toString(result));

        // 6. 测试静态方法isEqual方法, 个人感觉这个方法没啥用处
        predicate = Predicate.isEqual("七夜雪");
        print("6---> " + predicate.test("七夜雪"));
        print("6---> " + predicate.test("七夜雪1"));
    }

}

输出结果:

1—> true
2—> [2, 4, 6, 8, 10]
3—> [4, 5]
4—> [1, 2, 6, 7, 8, 9, 10]
5—> [3, 4, 5]
6—> true
6—> false

你可能感兴趣的:(Java基础)