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

【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.dtcms.com/a/319581.html

相关文章:

  • vnc远程连接VirtualBox中的Ubuntu24.04(xvfb,虚拟屏幕)
  • 什么是SpringBoot
  • OpenAI深夜开源2个推理模型gpt-oss,o4-mini水平,国内直接使用,笔记本/手机就能跑
  • 适用于个人开发、中小型项目的Embedding方案(配合ChromaDB)
  • 计算机毕业设计java疫情防控形势下的高校食堂订餐管理系统 高校食堂订餐管理系统在疫情防控背景下的设计与实现 疫情防控期间高校食堂线上订餐管理平台
  • Windows下Rust编码实现MP4点播服务器
  • 3a服务器的基本功能1之身份认证
  • iSCSI 服务器
  • Ubuntu设置Samba文件共享
  • Spring AI 打造智能面试人实战
  • Debian系统 为账号添加sudo权限
  • 通用优化软件GAMS的数学建模和优化分析
  • 快手提出强化学习创新框架RLEP,突破大模型推理瓶颈
  • AI算力平台统一监控方案:让AI算力资源透明化
  • 电线杆鸟巢识别误检率↓75%:陌讯多模态融合算法实战解析
  • 多线程问题,子线程同时操作全局变量,使用后需要清空吗 ?
  • Python生产环境部署指南:专业级应用启动方案
  • USRP 毫米波通信解决方案
  • SpringBoot如何固定版本
  • day069-Jenkins基础使用与参数化构建
  • 网络安全与软件定义汽车的发展
  • [spring-cloud: 动态刷新]-源码分析
  • k8s中pod如何调度?
  • USB3.0 枚举流程
  • 前端页面直接生成PDF下载文件
  • Python实现点云随机一致性(RANSAC)配准——粗配准
  • 软件测试中,pytest 运行完成后,如何自动发送邮件?
  • vscode 打开设置
  • OpenCV 入门实战:从环境配置到图像 / 视频处理
  • Java 八大经典排序算法全解析