文章目录
-
- 1. 源码
- 2. 分析
1. 源码
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);}
}
2. 分析
-
Predicate 是个断言式接口其参数是 <T,boolean>,也就是给一个参数T,返回boolean类型的结果。跟 Function 一样,Predicate 的具体实现也是根据传入的lambda表达式来决定的。
boolean test(T t);
-
Predicate 默认实现了三个重要的方法 and,or 和 negate,这三个方法对应了 java 的三个连接符号
&&、||、!
,基本的使用十分简单,如:int[] numbers= { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; List<Integer> list=new ArrayList<>(); for(int i:numbers) { list.add(i); } Predicate<Integer> p1=i->i>5; Predicate<Integer> p2=i->i<20; Predicate<Integer> p3=i->i%2==0; List test=list.stream().filter(p1.and(p2).and(p3)).collect(Collectors.toList()); System.out.println(test.toString()); //结果 [6, 8, 10, 12, 14]
我们定义了三个断言 p1,p2,p3。现在有一个从 1~15 的 list,我们需要过滤这个 list。上述的 filter 是过滤出所有大于 5 小于20,并且是偶数的列表。
假如突然我们的需求变了,我们现在需要过滤出奇数。那么我不可能直接去改Predicate,因为实际项目中这个条件可能在别的地方也要使用。那么此时我只需要更改 filter 中 Predicate 的条件:
List test=list.stream().filter(p1.and(p2).and(p3.negate())).collect(Collectors.toList());//结果 [7, 9, 11, 13, 15]
我们直接对p3这个条件取反就可以实现了。
-
isEqual 这个方法的返回类型也是 Predicate,所以我们也可以把它作为函数式接口进行使用。我们可以当做
==
操作符来使用List test=list.stream().filter(p1.and(p2).and(p3.negate()).and(Predicate.isEqual(7))).collect(Collectors.toList());//结果 7