当前位置 博文首页 > 文章内容

    预定义的函数式接口 Predicate

    作者: 栏目:未分类 时间:2020-09-18 14:00:56

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    函数式接口 Predicate

     

    函数接口: Predicate<T>

    方法定义: boolean test(T t);

    说明: 谓词,测试输入是否满足条件

     

    接口源码

    @FunctionalInterface
    public interface Predicate<T> {
        /**
         * 具体过滤操作 需要被子类实现.
         * 用来处理参数T是否满足要求,可以理解为 条件A
         */
        boolean test(T t);
        /**
         * 调用当前Predicate的test方法之后再去调用other的test方法,相当于进行两次判断
         * 可理解为 条件A && 条件B
         */
        default Predicate<T> and(Predicate<? super T> other) {
            Objects.requireNonNull(other);
            return (t) -> test(t) && other.test(t);
        }
        /**
         * 对当前判断进行"!"操作,即取非操作,可理解为 !条件A
         */
        default Predicate<T> negate() {
            return (t) -> !test(t);
        }
        /**
         * 对当前判断进行"||"操作,即取或操作,可以理解为 条件A ||条件B
         */
        default Predicate<T> or(Predicate<? super T> other) {
            Objects.requireNonNull(other);
            return (t) -> test(t) || other.test(t);
        }
    
        /**
         * 对当前操作进行"="操作,即取等操作,可以理解为 A == B
         */
        static <T> Predicate<T> isEqual(Object targetRef) {
            return (null == targetRef)
                    ? Objects::isNull
                    : object -> targetRef.equals(object);
        }
    }

    Predicate示例

    定义一个简单的学生类Student,它有name和score两个属性,如下所示。

    @Setter
    @Getter
    public class Student {
    
        String name;
    
        double score;
    
        public Student(String name, double score) {
            this.name = name;
            this.score = score;
        }
    }

    在日常开发中,列表处理的一个常见需求是过滤,列表的类型经常不一样,过滤的条件也经常变化,但主体逻辑都是类似的,可以借助Predicate写一个通用的方法,如下所示:

        public static <E> List<E> filter(List<E> list, Predicate<E> pred) {
            List<E> retList = new ArrayList<>();
            for (E e : list) {
                if (pred.test(e)) {
                    retList.add(e);
                }
            }
            return retList;
        }

    这个方法可以这么用:

            List<Student> students = Arrays.asList(new Student[]{
                    new Student("zhangsan", 80d),
                    new Student("lisi", 89d),
                    new Student("wangwu", 98d)});
    
            Predicate<Student> predicate = t -> t.getScore() > 80;//过滤 >80
            List<Student> students_1 = filter(students, predicate);
            System.out.println("students_1:" + students_1.toString());
    
            Predicate<Student> predicate_and = predicate.and(t -> t.getScore() < 90);//过滤 <90
            List<Student> students_2 = filter(students, predicate_and);
            System.out.println("students_2:" + students_2.toString());