JDK8引入了Predicate接口,来判断参数是否符合要求。
Predicate接口的实现类需要实现test()方法。
先来看下源码吧!!! Predicate接口中方法
Predicate方法概览
// 对给定参数判断是否符合要求,需要实现类实现该方法
boolean test(T t);
// 对当前的Predicate执行test方法后,在执行other的test方法
default Predicate<T> and(Predicate<? super T> other)
// 判断当前Predicate的非操作,相当于 !test(t);
default Predicate<T> negate()
// 对当前的Predicate与other 的或操作,相当于 this.test(t) || other.test(t)
default Predicate<T> or(Predicate<? super T> other)
// 判断是否相当,相当于 this.equals(target)
static <T> Predicate<T> isEqual(Object targetRef)
Predicate源码
/**
* 作用:判断一个参数是否符合要求
*/
@FunctionalInterface
public interface Predicate<T> {
/**
* 对给定参数判断是否符合要求
*/
boolean test(T t);
/**
* 对当前的Predicate执行test方法后,在执行other的test方法
* return : 相当于 t.test && other.test()
*/
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
/**
* 判断当前Predicate的非操作,相当于 !test(t);
*/
default Predicate<T> negate() {
return (t) -> !test(t);
}
/**
* 对当前的Predicate与other 的或操作,相当于 this.test(t) || other.test(t)
* @throws NullPointerException if other is null
*/
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
/**
* 判断是否相当,相当于 this.equals(target)
*/
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
先来个测试类
public class PredicateTest {
@Test
public void test(){
// A:判断参数是否大于10
Predicate predicate = new Predicate<Integer>() {
@Override
public boolean test(Integer o) {
return o.intValue() > 10;
}
};
// B:断言11大于10
assert predicate.test(11);
// C:断言9 不大于 10
assert predicate.negate().test(9);
// D:断言 12>10 && 12为偶数
assert predicate.and(new Predicate<Integer>() {
@Override
public boolean test(Integer o) {
return o.intValue() % 2 == 0;
}
}).test(12);
// E:断言 8>10 || 8为偶数
assert predicate.or(new Predicate<Integer>() {
@Override
public boolean test(Integer o) {
return o.intValue() % 2 == 0;
}
}).test(8);
assert Predicate.isEqual(10).test(10);
}
}
运行结果:断言成功
测试类都干了哪些事情:
A:判断参数是否大于10
B:断言11大于10
C:断言9 不大于 10
D:断言 12>10 && 12为偶数
E:断言 8>10 || 8为偶数
来看看JDK,Collection中Predicate的使用
看看Collection.removeIf(Predicate<? super E> filter)方法的实现
// 删除满足filter条件的所有元素
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}