如果还不懂如何使用Consumer接口,来公司我当面给你讲!(四)

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战」。

最后我们来说一下 Predicate 的源码及使用情况!

Predicate 

我们称之为“判断者”,通过接收参数 T 来返回 boolean 的结果。

@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);
    }
}
复制代码

方法解析:

  • test:接收一个参数, 判断这个参数是否匹配某种规则, 匹配成功返回true, 匹配失败则返回false;
  • and:接收一个 Predicate 类型的参数,用当前函数和 other 函数逻辑与判断参数 t 是否匹配规则,成功返回true,失败返回 false 。如果当前函数返回 false,则 other 函数不进行计算。在评估 Predicate 期间引发的任何异常都会转发给调用方;
  • negate:返回当前Predicate取反操作之后的Predicate;
  • or:接收一个 Predicate 类型的参数,用当前函数和 other 函数 逻辑或 判断参数 t 是否匹配规则,成功返回true,失败返回 false 。如果当前函数返回 true,则 other 函数不进行计算。在评估 Predicate 期间引发的任何异常都会转发给调用方;
  • isEqual: 静态方法:传入一个参数,用来生成一个 Predicate,调用test() 方法时调的 object -> targetRef.equals(object) 函数式。

相信大家在编码过程中经常会遇到该函数式接口,我们举个例子来说一下:

public static void main(String[] args) {
    List<Teacher> list = Arrays.asList(
        new Teacher("张三",25),
        new Teacher("李四",28),
        new Teacher("王五",18));

    list = list.stream().filter(item -> item.getAge()>25).collect(Collectors.toList());
    list.stream().forEach(item->System.out.println(item.getName()));
}
复制代码

其中 filter() 的参数为 Predicate 类型的,返回结果为:李四

看到这儿,我们常见的四种函数式接口就已经介绍完了。说实话,函数式接口我已经看过好几遍了,尤其是 ConsumerSupplier。当时只是脑子里学会了,没有应用到具体的项目中,下次再遇到的时候还是一脸懵逼,不知道大家有没有这种感受。

所以我们需要总结经验教训,一定要将代码的原理搞懂,然后多敲几遍,争取应用到自己的项目中,提升自己的编码能力。

以上就是今天的全部内容了,如果你有不同的意见或者更好的idea,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!