常用函数式接口_Predicate

本文介绍了Java中function包下的Predicate接口,展示了如何通过lambda表达式实现逻辑判断、组合条件(and、or)以及逻辑否定(negate),并应用在列表过滤和条件判断中。

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

函数式接口Predicate

软件包 java.util.function

Interface Predicate<T>

Predicate 接口用来判断传递的参数是否满足条件,并返回一个布尔值

方法摘要
返回值类型方法描述
default Predicateand​(Predicate<? super T> other)返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑AND。
static PredicateisEqual​(Object targetRef)返回一个谓词,根据 Objects.equals(Object, Object)测试两个参数是否相等。
*不常用
default Predicatenegate​()返回表示此谓词的逻辑否定的谓词。
default Predicateor​(Predicate<? super T> other)返回一个组合的谓词,表示该谓词与另一个谓词的短路逻辑或。
booleantest​(T t)在给定的参数上评估这个谓词。
  • test()方法:对给定的参数进行逻辑判断,并返回布尔值
import java.util.ArrayList;
import java.util.function.Predicate;

public class PredicateDemo01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张无鸡");
        list.add("狄仁杰");
        list.add("卡萨丁");
        list.add("张彪");
        list.add("黄宇轩");
        list.add("李仁杰");

        //找出列表中的"张彪"
        //增强for遍历列表
        for (String name : list){
            //使用lambda表达式来实现test()方法的逻辑判断
            if (checkName(name, s -> "张彪".equals(name))) {
                System.out.println(name);
                break;
            }
        }
    }

    private static boolean checkName(String name, Predicate<String> pre){
        //调用test()方法,进行逻辑判断,并返回布尔值
        return pre.test(name);
    }
}
  • and()方法:对给定参数的两个不同条件精选逻辑判断,并把两次判断结果 逻辑与(&&) 后返回一个布尔值
import java.util.ArrayList;
import java.util.function.Predicate;

public class PredicateDemo01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张无鸡,男");
        list.add("狄杰,男");
        list.add("卡萨丁,女");
        list.add("张彪,男");
        list.add("黄轩,女");
        list.add("李仁杰,女");

        //找出列表中的长度为 2 且 性别为"男"的名字
        //增强for遍历列表
        for (String name : list) {
            //以逗号分割字符串
            String[] split = name.split(",");
            //判断是名字长度是否为2
            boolean flag = split[0].length() == 2;
            //判断性别是否为男
            boolean gender = "男".equals(split[1]);
            //对以上条件进行逻辑与运算,并输出结果
            if (flag && gender)
                System.out.println("简单实现:\t\t\t" + name);


            //调用checkName方法,并用lambda表达式优化代码
            if (checkName(name, s -> name.split(",")[0].length() == 2,
                    s -> "男".equals(name.split(",")[1])))
                System.out.println("Predicate接口实现:\t" + name);

        }
    }
    

    private static boolean checkName(String name, Predicate<String> pre1, Predicate<String> pre2) {
//        //调用两次test()方法,进行逻辑判断
//        boolean test1 = pre1.test(name);
//        boolean test2 = pre2.test(name);
//        //返回两次判断的逻辑与结果
//        return (test1 && test2);
        //使用 and() 方法对以上代码进行优化
        return pre1.and(pre2).test(name);
    }

}
  • or()方法:对给定参数的两个不同条件精选逻辑判断,并把两次判断结果 逻辑或(||) 后返回一个布尔值
import java.util.ArrayList;
import java.util.function.Predicate;

public class PredicateDemo01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("张无鸡,男");
        list.add("狄杰,男");
        list.add("卡萨丁,女");
        list.add("张彪,男");
        list.add("黄轩,女");
        list.add("李仁杰,女");

        //找出列表中的长度为 或者 性别为"男"的名字
        //增强for遍历列表
        for (String name : list) {

            //调用checkName方法,并用lambda表达式优化代码
            if (checkName_or(name, s -> name.split(",")[0].length() == 2,
                    s -> "男".equals(name.split(",")[1])))
                System.out.println(name);

        }
    }

    private static boolean checkName_or(String name, Predicate<String> pre1, Predicate<String> pre2) {
//        //调用两次test()方法,进行逻辑判断
//        boolean test1 = pre1.test(name);
//        boolean test2 = pre2.test(name);
//        //返回两次判断的逻辑与结果
//        return (test1 || test2);
        //使用 or() 方法对以上代码进行优化
        return pre1.or(pre2).test(name);
    }


}
  • negate()方法:对给定的参数进行逻辑判断后,取反
import java.util.function.Predicate;

public class PredicateDemo02 {
    public static void main(String[] args) {
        int[] num = {10, 22, 73, 51, 9, 53, 57};

        //将num数组中不是2的倍数的数字输出
        for (int n : num){
            //使用lambda表达式实现
            if (checkNum(n, i -> i % 2 == 0))
                System.out.println(n);;
        }
    }

    private static boolean checkNum(int n, Predicate<Integer> pre){
        //判断数字是否为2的倍数,取反后返回
        return pre.negate().test(n);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值