Java 8 Predicate类基本使用详解

一、基本方法

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

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
PredicateJava中的一个函数式接口,定义在java.util.function包中。它包含了test方法,用于对某个输入进行条件判断并返回布尔值。根据引用和引用的内容,Predicate提供了and和or两个默认方法,用于对两个Predicate进行逻辑与和逻辑或操作。具体来说,and方法会返回一个新的Predicate,它会对同一个输入进行两个Predicate的条件判断,只有当两个Predicate都返回true时,它才会返回true。而or方法也会返回一个新的Predicate,它会对同一个输入进行两个Predicate的条件判断,只有当两个Predicate中至少有一个返回true时,它才会返回true。根据引用的代码示例,我们可以看到Predicate使用范例。在示例中,我们定义了三个具体的Predicate:length、startsWith和endsWith,分别用于判断字符串的长度、是否以指定前缀开头和是否以指定后缀结尾。然后我们使用and、or方法对这些Predicate进行组合,并将组合后的Predicate应用在一个字符串列表上,用于过滤出符合条件的字符串并进行打印输出。123 #### 引用[.reference_title] - *1* *2* *3* [Java 8 Predicate基本使用详解](https://blog.csdn.net/qazzwx/article/details/107864622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值