Predicate

原文链接

1、Predicate API用法

  • java.util.function.Predicate:Predicate 接口有5个方法
    • test:抽象方法,在给定的参数上评估这个
    • and:default方法,返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑AND
    • or:default方法,返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑或
    • negate:default方法,返回表示此谓词的逻辑否定的谓词
    • isEqual:返回根据 Objects.equals(Object, Object)测试两个参数是否相等的 谓词
  • JDK8在线源码英文文档:https://nowjava.com/readcode/jdk8
  • JDK8在线源码中文文档:https://www.matools.com/api/java8

1-1、test

  • 示例
        Predicate<Integer> predicate =new Predicate<Integer>() {
            @Override
            public boolean test(Integer integer) {
                return 0 != integer;
            }
        };
        // false
        System.out.println(predicate.test(0));

        // true
        Predicate<Integer> predicate1 = (integer -> {return 0 != integer;});
        System.out.println(predicate1.test(1));

1-2、and / or / negate



        Predicate<String> first = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                System.out.println("first");
                return s.length() > 4 ? true : false;
            }
        };

        Predicate<String> second = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                System.out.println("second");
                return s.startsWith("1") ? true : false;
            }
        };

        // 逻辑且&& 只执行了 first
        boolean test1 = first.and(second).test("123");
        System.out.println(test1);// false

        // 逻辑或|| first second 都执行
        boolean test2 = first.or(second).test("123");
        System.out.println(test2);// true

        // 逻辑反 !
        Predicate<String> negate = first.negate();
        boolean test3 = negate.test("12345");
        System.out.println(test3);// false

1-3、isEqual

        // isEqual传入第一个参数
        Predicate<Object> predicate = Predicate.isEqual("123");

        // test传入第二个参数
        boolean test4 = predicate.test("123");
        // 比较这两个参数是否一样
        System.out.println(test4);// true
        boolean test5 = predicate.test("456");
        System.out.println(test5);// false

2、源码翻译

  • Objects::isNull 双冒号,方法引用
package java.util.function;

import java.util.Objects;

/**
 * Represents a predicate (boolean-valued function) of one argument.
 * 表示一个参数的谓词(布尔值函数)
 *
 * <p>This is a <a href="package-summary.html">functional interface</a>
 * whose functional method is {@link #test(Object)}.
 * 这是一个functional interface的功能方法是test(Object)
 *
 * @param <T> the type of the input to the predicate
 *
 * @since 1.8
 */
@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     * 在给定的参数上评估这个谓语
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false} true如果输入参数匹配谓词,否则为 false
     */
    boolean test(T t);

    /**
     * Returns a composed predicate that represents a short-circuiting logical
     * AND of this predicate and another.  When evaluating the composed
     * predicate, if this predicate is {@code false}, then the {@code other}
     * predicate is not evaluated.
     * 返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑AND。
     * 当评估组合谓词时,如果此谓词为false ,则other谓词 就不需要评估了。
     *
     *
     * <p>Any exceptions thrown during evaluation of either predicate are relayed
     * to the caller; if evaluation of this predicate throws an exception, the
     * {@code other} predicate will not be evaluated.
     * 在评估任一谓词期间抛出的任何异常被中继到调用者; 如果此断言的评价抛出一个异常, other断言不会被评估。
     *
     * @param other a predicate that will be logically-ANDed with this
     *              predicate
     * @return a composed predicate that represents the short-circuiting logical
     * AND of this predicate and the {@code other} predicate
     * @throws NullPointerException if other is null
     */
    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    /**
     * Returns a predicate that represents the logical negation of this
     * predicate.
     * 返回表示此谓词的逻辑否定的谓词。
     *
     * @return a predicate that represents the logical negation of this
     * predicate
     */
    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    /**
     * Returns a composed predicate that represents a short-circuiting logical
     * OR of this predicate and another.  When evaluating the composed
     * predicate, if this predicate is {@code true}, then the {@code other}
     * predicate is not evaluated.
     * 返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑或。
     * 当评估组合谓词时,如果此谓词为true ,则other谓词不需要评估。
     *
     *
     * <p>Any exceptions thrown during evaluation of either predicate are relayed
     * to the caller; if evaluation of this predicate throws an exception, the
     * {@code other} predicate will not be evaluated.
     * 在评估任一谓词期间抛出的任何异常被中继到调用者; 如果此断言的评价抛出一个异常, other断言不会被评估。
     *
     * @param other a predicate that will be logically-ORed with this
     *              predicate
     * @return a composed predicate that represents the short-circuiting logical
     * OR of this predicate and the {@code other} predicate
     * @throws NullPointerException if other is null
     */
    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    /**
     * Returns a predicate that tests if two arguments are equal according
     * to {@link Objects#equals(Object, Object)}.
     * 返回测试,如果两个参数按照相等谓词 Objects.equals(Object, Object) 。
     *
     * @param <T> the type of arguments to the predicate
     * @param targetRef the object reference with which to compare for equality,
     *               which may be {@code null}
     * @return a predicate that tests if two arguments are equal according
     * to {@link Objects#equals(Object, Object)}
     */
    static <T> Predicate<T> isEqual(Object targetRef) {
        // 双冒号 方法引用(method reference) 提供了一种不执行方法的方法
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值