持续创作,加速成长!这是我参与「掘金日新计划 · 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);
}
}
这几个方法看方法名就知道它们的作用是什么了。分别为:
- test: 判断true/false 逻辑
- and: 根据传入的参数,判断“与”的关系
- negate: 给出“非”的结果
- or:根据传入的参数,给出“或”的关系
- 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。
当我们分别调用and 和or 方法时,代码如下:
System.out.println(p1.and(p2).test("juejin"));
System.out.println(p1.or(p2).test("jj"));
针对Precidate接口,可能我们在开发中并没有太多的显示定义,但是我们经常会涉及到它的使用,如:
在我们常用的filter方法中,传入的就是一个Precidate判断条件。
另外,我们可以使用Predicate 的上述其他几个方法组合起来进行判断。如:
list.stream().filter(p1.and(p2)).collect(Collectors.toList());
总结
其实我们可以看出,从第一个介绍的Consumer开始,到Function,再到现在的这个Predicate,每一个内置的函数式编程接口都有固定的特点,理解起来也不是太难,因为其本质也是一个对象,只不过是换了一套语法而已。我们一定要活学活用,不仅仅是为了看懂别人的代码,更是为了我们可以写出更优雅的code~