JDK8新特性-Predicate

259 阅读2分钟

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;
    }