常用的函数式接口_Prodicate接口_默认方法or&negate和常用的函数式接口_Predicate接口练习_集合信息筛选

常用的函数式接口_Prodicate接口_默认方法or&negate

OR

package com.yang.Test.PredicateStudy;

import java.util.function.Predicate;

/**
 * 需求:判断一个字符串,有两个判断条件
 * 1.判断字符串的长度是否大于5
 * 2.判断字符串中是否包含a
 * 满足一个条件即可,我们就可以使用||运算符链接两个条件
 *
 * Predicate接口中有一个方法or,表示或者关系,也可以用于连续两个判断条件
 * default Predicate<T> and(Predicate<? super T> other){
 *     Objects.requireNonNull(other);
 *     return (t) -> this.test(t) || other.test(t);
 * }
 * 方法内部两个判断条件,也是使用||连接起来的
 */
public class PredicateOrStudy {

    /**
     * 定义一个方法,方法的参数,传递一个字符串
     * 传递两个Predicate接口
     * 一个用于判断字符串的长度是否大于5
     * 一个用于判断字符串中是否包含a
     * 满足一个条件即可
     */
    public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
        //return pre1.test(s) || pre2.test(s);
        return pre1.or(pre2).test(s);
    }

    public static void main(String[] args) {
        //定义一个字符串
        String s = "abc";
        //调用checkString方法,参数列表传递字符串和两个Predicate接口
        boolean b = checkString(s, message -> {
            return message.length() > 5;
        }, message -> {
            return message.contains("a");
        });
        System.out.println(b);

    }
}

negate

package com.yang.Test.PredicateStudy;

import java.util.function.Predicate;

/**
 * 需求:判断一个字符串长度是否大于5
 * 如果字符串的长度大于5,那么返回false
 * 如果字符串的长度不大于5,那么返回true
 * 所以我们可以使用取反符号!对判断的结果进行取反
 *
 * Predicate接口中有一个方法negate,也表示取反的意思
 * default Predicate<T> negate(){
 *     return (t) -> !test(t);
 * }
 */
public class PredicateNegateStudy {

    /**
     * 定义一个方法,方法的参数,传递一个字符串
     * 使用Predicate接口判断字符串的长度是否大于5
     */
    public static boolean checkString(String s, Predicate<String> pre1) {
        //return !pre1.test(s);
        return !pre1.test(s);
    }


    public static void main(String[] args) {
        //定义一个字符串
        String s = "abc";
        //调用checkString方法,参数列表传递字符串和Lambda表达式
        boolean b = checkString(s, message -> {
            return message.length() > 5;
        });
        System.out.println(b);

    }
}

常用的函数式接口_Predicate接口练习_集合信息筛选

题目

数组当中由多条姓名+性别的信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,需要同时满足两个条件:
1.必须为女生;
2.名字为4个字。

分析:
定义一个方法
方法的参数传递一个包含人员信息的数组
传递两个Predicate接口,用于对数组中的信息进行过滤
把满足条件的信息存到ArrayList集合中并返回

代码实现:

package com.yang.Test.PredicateStudy;

import java.util.ArrayList;
import java.util.function.Predicate;

/**
 * 数组当中由多条姓名+性别的信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,
 * 需要同时满足两个条件:
 * 1.必须为女生;
 * 2.名字为4个字。
 */
public class Test {
    public static void main(String[] args) {
        String[] array = {"迪丽热巴,女","古力娜扎,女","马儿扎哈,男","赵丽颖,女"};
        //调用filter传递字符串数组和两个Predicate
       ArrayList<String> list = filter(array,s -> {
            //获取字符串的性别,判断是否为女
            return s.split(",")[1].equals("女");
        },s -> {
            //获取字符串的姓名判断长度是否为4
            return s.split(",")[0].length()==4;
        });


        list.forEach(s -> System.out.println(s));
    }

    public static ArrayList<String> filter(String[] arr, Predicate<String> pre1, Predicate<String> pre2) {
        //定义一个ArrayList集合来存储筛选后的信息
        ArrayList<String> list = new ArrayList<>();
        //遍历数组,获取数组中的每一个元素
        for (String s : arr) {
            //使用Predicate中的方法test对获取到的字符串进行判断
            boolean b = pre1.and(pre2).test(s);
            //对得到的结果进行判断
            if (b){
                //条件成立添加到集合中
                list.add(s);
            }
        }
        //把集合返回
        return list;
    }
}

运行结果:
image

posted @ 2022-07-20 16:36  我滴妈老弟  阅读(41)  评论(0编辑  收藏  举报