「这是我参与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
类型的,返回结果为:李四
看到这儿,我们常见的四种函数式接口就已经介绍完了。说实话,函数式接口我已经看过好几遍了,尤其是 Consumer
和 Supplier
。当时只是脑子里学会了,没有应用到具体的项目中,下次再遇到的时候还是一脸懵逼,不知道大家有没有这种感受。
所以我们需要总结经验教训,一定要将代码的原理搞懂,然后多敲几遍,争取应用到自己的项目中,提升自己的编码能力。
以上就是今天的全部内容了,如果你有不同的意见或者更好的idea
,欢迎联系阿Q,添加阿Q可以加入技术交流群参与讨论呦!
近期评论