Java 8 Predicate类基本使用详解

本文深入探讨Java Stream API中Predicate接口的使用方法,包括test、and、or、negate及isEqual方法,通过具体示例展示了如何结合Lambda表达式进行数据过滤,适用于Java开发者提升编程效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基本方法

1.1、test(T t) 方法:

       test方法主要用于参数符不符合规则。返回值 boolean

写法如下:

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

配合Lambda filter 使用如下:

public static void main(String[] args) {
        List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp","Hell","opt");
        Predicate<String> fourLetterLong1 = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length()>4 ? true : false ;
            }
        };
        names.stream()
                .filter(fourLetterLong1)
                .forEach((n) -> System.out.println("this is:" + n));
    }

1.2 、and(Predicate<? super T> other)

 default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

         add 方法等同于我们的逻辑与&&,存在短路特性,需要所有条件都满足

配合Lambda filter 使用如下:

public static void main(String[] args) {
        List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
        
        Predicate<String> fourLetterLong1 = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.length() > 4 ? true : false;
            }
        };
        
        Predicate<String> startsWith = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.equals("Haskell") ? true : false;
            }
        };

        names.stream()
                .filter(fourLetterLong1.and(startsWith))
                .forEach((n) -> System.out.println("this is:" + n));
    }

1.3 、or(Predicate<? super T> other)

default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

      or 等同于我们的逻辑或 || ,多个条件只要一个满足即可

配合Lambda filter 使用如下:

 public static void main(String[] args) {
        List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");

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

        Predicate<String> startsWith = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.equals("zzz") ? true : false;
            }
        };

        names.stream()
                .filter(fourLetterLong1.or(startsWith))
                .forEach((n) -> System.out.println("this is:" + n));
    }

 1.4、negate()方法

        negate等同于我们的逻辑非 !

配合Lambda filter 使用如下:

 public static void main(String[] args) {
        List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");

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

        names.stream()
                .filter(fourLetterLong1.negate())
                .forEach((n) -> System.out.println("this is:" + n));
    }

1.5、isEqual(Object targetRef)方法

static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }

       isEqual 类似于equals()区别在于:先判断对象是否为NULL,不为Null的话再使用equals()方法进行比较

配合Lambda filter 使用如下:

public static void main(String[] args) {
        List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");

       
        Predicate<String> isEqual = new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return Predicate.isEqual("Java").test(s) ? true : false;
            }
        };
        names.stream()
                .filter(isEqual)
                .forEach((n) -> System.out.println("this is:" + n));
    }

二、扩展

 使用Lambda 新特性和String类中的方法 多条查询

public static void main(String[] args) {
        List names = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp", "Hell", "opt");
        //长度为7
        Predicate<String> length = (n) -> n.length() == 4;
        // endsWith 方法字符串是否以指定的前缀开头。
        Predicate<String> startsWith = (n) -> n.startsWith("J");
        // endsWith 字符串是否以指定的后缀结尾。
        Predicate<String> endsWith = (n) -> n.endsWith("a");
        Predicate<String> isEqual = (n) ->Predicate.isEqual("Haskell").test(n);
        names.stream()
                .filter(length.and(startsWith).and(endsWith).or(isEqual))
                .forEach((n) -> System.out.println("this is:" + n));
    }

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值