探索Java8:(三)Predicate接⼝的使⽤
上⼀篇学习了下Function接⼝的使⽤,本篇我们学习下另⼀个实⽤的函数式接⼝Predicate。
Predicate的源码跟Function的很像,我们可以对⽐这两个来分析下。直接上Predicate的源码:raid
ticket是什么意思public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*/
boolean test(T t);
/**
* Returns a compod predicate that reprents a short-circuiting logical
* AND of this predicate and another. When evaluating the compod
* predicate, if this predicate is {@code fal}, then the {@code other}
* predicate is not evaluated.
*/
default Predicate<T> and(Predicate<? super T> other) {
return (t) -> test(t) && st(t);
}
/**
* Returns a predicate that reprents the logical negation of this
* predicate.
*/
default Predicate<T> negate() {
return (t) -> !test(t);
}
/**
* Returns a compod predicate that reprents a short-circuiting logical
* OR of this predicate and another. When evaluating the compod
* predicate, if this predicate is {@code true}, then the {@code other}
* predicate is not evaluated.
*/
default Predicate<T> or(Predicate<? super T> other) {
return (t) -> test(t) || st(t);
成人英文}
/**
* Returns a predicate that tests if two arguments are equal according
jordin sparks* to {@link Objects#equals(Object, Object)}.
*/
veredstatic <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)willing
Objects::isNull
: object -> targetRef.equals(object);
}
}
Predicate是个断⾔式接⼝其参数是<T,boolean>,也就是给⼀个参数T,返回boolean类型的结果。跟Function⼀样,Predicate的具体实现也是根据传⼊的lambda表达式来决定的。
boolean test(T t);
接下来我们看看Predicate默认实现的三个重要⽅法and,or和negate
default Predicate<T> and(Predicate<? super T> other) {
return (t) -> test(t) && st(t);
}
default Predicate<T> negate() {
英语四级考试技巧return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
return (t) -> test(t) || st(t);
}
这三个⽅法对应了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)).List());
preferSystem.out.String());
/** print:[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).ate())).List());
/** print:[7, 9, 11, 13, 15]*/
我们直接对p3这个条件取反就可以实现了。是不是很简单?
batterypack
isEqual这个⽅法的返回类型也是Predicate,所以我们也可以把它作为函数式接⼝进⾏使⽤。我们可以当做==操作符来使⽤。
List test=list.stream()
.filter(p1.and(p2).ate()).and(Predicate.isEqual(7)))
.List());
/** print:[7] */