当前位置: 首页 > ds >正文

【Java】Predicate使用案例

【Java】Predicate使用案例

  • 【一】Predicate 的基本用法
    • 【1】案例 1:基础过滤(判断单个条件)
    • 【2】案例 2:结合 Stream 过滤集合
    • 【3】案例 3:组合多个 Predicate(与、或、非)
    • 【4】案例 4:自定义对象的多条件查询
  • 【二】核心总结

Predicate 是 Java 8 引入的函数式接口(位于 java.util.function 包),用于表示一个布尔值的判断条件,其核心方法是 test(T t),返回 boolean 结果。它常用于过滤、条件判断等场景,配合 Stream API 使用尤为方便。

【一】Predicate 的基本用法

Predicate 接收一个泛型参数 T,通过 test() 方法对参数进行判断。

常见操作包括:
(1)直接使用 lambda 表达式创建 Predicate 实例
(2)组合多个 Predicate(与、或、非)

【1】案例 1:基础过滤(判断单个条件)

需求:过滤出列表中年龄大于 18 的用户。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;class User {private String name;private int age;public User(String name, int age) {this.name = name;this.age = age;}public int getAge() { return age; }public String getName() { return name; }@Overridepublic String toString() { return name + "(" + age + ")"; }
}public class PredicateDemo {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User("张三", 20));users.add(new User("李四", 17));users.add(new User("王五", 25));// 定义Predicate:判断年龄是否大于18Predicate<User> isAdult = user -> user.getAge() > 18;// 过滤并打印成年用户for (User user : users) {if (isAdult.test(user)) { // 调用test()方法判断System.out.println(user);}}}
}

【2】案例 2:结合 Stream 过滤集合

Predicate 与 Stream 的 filter() 方法配合,可简洁地过滤集合。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;public class PredicateStreamDemo {public static void main(String[] args) {List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9);// 过滤出偶数(使用Predicate作为filter的参数)Predicate<Integer> isEven = num -> num % 2 == 0;numbers.stream().filter(isEven) // 传入Predicate.forEach(System.out::println); // 输出:2 4 6 8}
}

【3】案例 3:组合多个 Predicate(与、或、非)

Predicate 提供了默认方法用于组合条件:
(1)and(Predicate):逻辑与(两个条件都满足)
(2)or(Predicate):逻辑或(满足任一条件)
(3)negate():逻辑非(取反条件)
需求:过滤出 “年龄大于 18 且名字长度大于 2” 的用户。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;public class PredicateCombineDemo {public static void main(String[] args) {List<User> users = new ArrayList<>();users.add(new User("张三", 20));   // 年龄达标,名字长度2(不达标)users.add(new User("李四四", 17)); // 年龄不达标,名字长度3(达标)users.add(new User("王五五", 25)); // 两者都达标// 条件1:年龄>18Predicate<User> agePredicate = u -> u.getAge() > 18;// 条件2:名字长度>2Predicate<User> namePredicate = u -> u.getName().length() > 2;// 组合条件:年龄达标 且 名字达标(使用and())Predicate<User> combined = agePredicate.and(namePredicate);// 过滤并打印users.stream().filter(combined).forEach(System.out::println); // 输出:王五五(25)}
}

其他组合示例:

// 年龄>18 或 名字长度>2(使用or())
Predicate<User> orCombined = agePredicate.or(namePredicate);// 年龄不大于18(使用negate()取反)
Predicate<User> notAdult = agePredicate.negate();

【4】案例 4:自定义对象的多条件查询

需求:根据动态条件查询用户(如可选条件:年龄范围、姓名包含特定字符)。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;public class PredicateQueryDemo {// 根据条件查询用户public static List<User> findUsers(List<User> users, Predicate<User> predicate) {List<User> result = new ArrayList<>();for (User user : users) {if (predicate.test(user)) {result.add(user);}}return result;}public static void main(String[] args) {List<User> users = List.of(new User("张三", 20),new User("张四", 22),new User("李四", 17));// 查询:名字包含"张"且年龄>18Predicate<User> query = u -> u.getName().contains("张") && u.getAge() > 18;List<User> result = findUsers(users, query);System.out.println(result); // 输出:[张三(20), 张四(22)]}
}

【二】核心总结

(1)Predicate 用于条件判断,核心方法 test(T t) 返回布尔值。
(2)常与 Stream.filter() 配合,简化集合过滤逻辑。
(3)支持通过 and()、or()、negate() 组合多个条件,实现复杂判断。
(4)作为函数式接口,可直接用 lambda 表达式创建,代码更简洁。
通过 Predicate,可以将条件判断逻辑抽离为独立的函数,提高代码的可读性和复用性。

http://www.xdnf.cn/news/17396.html

相关文章:

  • 制造业中小企业数字化转型“三步走”:业务系统稳健筑基,BI赋能智慧决策
  • 分布式面经
  • 分布式事务与分布式锁
  • STM32 串口控制电机运行系统
  • 深度学习中主要库的使用:(一)pandas,读取 excel 文件,支持主流的 .xlsx/.xls 格式
  • 【Zephyr】02_从零教你开发芯片级ADC驱动(HAL层篇)
  • IIS7.5下的https无法绑定主机头,显示灰色如何处理?
  • 基于 MATLAB 的 QPSK 调制、解调、通过高斯信道的误码率计算,并绘制误码率图和眼图、星座图
  • Numpy科学计算与数据分析:Numpy数学函数入门与实践
  • web前端结合Microsoft Office Online 在线预览,vue实现(PPT、Word、Excel、PDF等)
  • nlp-句法分析
  • 从配置到远程访问:如何用群晖NAS FTP+ Cpolar搭建稳定文件传输通道
  • 云平台运维工具 ——AWS 原生工具
  • 利用DeepSeek用两种方法编写go语言zstd实用程序
  • 软件加密工具-DSProtector使用说明
  • 关键字 - 第二讲
  • SpringBoot的优缺点
  • DNS查询过程?CDN是什么,有什么作用?
  • 嵌入式系统学习Day14(C语言中指针的拓展)
  • 音乐创作新潮流!豆包 + 蘑兔 A
  • macOS 彻底卸载 Python 的完整指南
  • RWA项目实战指南:流程设计到技术落地的完整路径
  • 硬件学习笔记--74 电泳与电镀的对比介绍
  • 「iOS」————持久化
  • 安卓Handler和Looper的学习记录
  • 13-netty基础-手写rpc-消费方生成代理-05
  • 30-Hive SQL-DML-Load加载数据
  • 上位机知识篇---蜂窝通信
  • 基于MATLAB实现支持向量机(SVM)分类
  • 目标检测数据集 - 高架视角道路车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」