Java 8 函数式编程(四)(Predicate 接口)

1,156 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情

上一篇文章我们介绍了Function 接口,这篇文章我们来介绍一下Predicate 接口。

Predicate 接口

Predicate同样为函数式接口,predicate 这个词的中文意思是“使基于、使取决于;表明、断定”,即判断的意思,所以说这个接口主要的作用就是判断某个东西是否满足某种条件。

Predicate 中包含test 方法,根据输入值来做逻辑判断,返回结果为True或者False

我们来看Predicate的函数定义:

@FunctionalInterface
public interface Predicate<T> {

    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

这几个方法看方法名就知道它们的作用是什么了。分别为:

  1. test: 判断true/false 逻辑
  2. and: 根据传入的参数,判断“与”的关系
  3. negate: 给出“非”的结果
  4. or:根据传入的参数,给出“或”的关系
  5. isEqual:根据传入的参数,判断是否相等

使用举例

首先我们定义两个Predicate:

Predicate<String> p1 = n -> n.equals("juejin");
Predicate<String> p2 = n -> n.startsWith("j");

然后调用negate方法如下:

System.out.println(p1.negate().test("juejin"));

negate方法本身是取反操作,所以输出就是:false。

当我们分别调用andor 方法时,代码如下:

System.out.println(p1.and(p2).test("juejin"));
System.out.println(p1.or(p2).test("jj"));

针对Precidate接口,可能我们在开发中并没有太多的显示定义,但是我们经常会涉及到它的使用,如:

image.png

在我们常用的filter方法中,传入的就是一个Precidate判断条件。

另外,我们可以使用Predicate 的上述其他几个方法组合起来进行判断。如:

list.stream().filter(p1.and(p2)).collect(Collectors.toList());

总结

其实我们可以看出,从第一个介绍的Consumer开始,到Function,再到现在的这个Predicate,每一个内置的函数式编程接口都有固定的特点,理解起来也不是太难,因为其本质也是一个对象,只不过是换了一套语法而已。我们一定要活学活用,不仅仅是为了看懂别人的代码,更是为了我们可以写出更优雅的code~