当前位置: 首页 > 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.lryc.cn/news/612702.html

相关文章:

  • 【CS创世SD NAND征文】额贴式睡眠监测仪的数据守护者:存储芯片如何实现7×24小时安眠状态下的全时稳定记录
  • Nuclei漏洞扫描工具(除了常见漏洞还支持CMS常见漏洞Gitlab、Jira、Splunk、Elastic)
  • 2025年主流开源音视频播放项目深度解析
  • Java技术栈/面试题合集(20)-运维与线上问题排查篇
  • nvm安装,nvm管理node版本
  • 【数据结构初阶】--排序(五)--计数排序,排序算法复杂度对比和稳定性分析
  • MATLAB科研数据可视化
  • 【CDA案例】数据分析案例拆解:解锁数据分析全流程!
  • 图像认知与OpenCV——图像预处理4
  • 计算机视觉--opencv(代码详细教程)
  • Java垃圾回收(GC)探析
  • 网络可视,运维无忧:分钟级定位,告别盲目扩容
  • 华为开源CANN,再次释放“昇腾转向”信号
  • spring boot学习计划
  • Qt: WA_DontCreateNativeAncestors
  • QT5.15 mingw
  • qt的元对象系统详解
  • B站,视频号怎么下载?,猫抓cat-catch离线版下载,Chrome扩展插件
  • 【Java】HashMap 的遍历方式有哪些?哪种更高效?
  • 什么是键值缓存?让 LLM 闪电般快速
  • OpenCV的关于图片的一些运用
  • 数据分析进阶——53页跨境数据分析【附全文阅读】
  • 僵尸进程问题排查
  • Mac+Chrome滚动截图
  • localforage的数据仓库、实例、storeName和name的概念和区别
  • OpenAI 开源模型 gpt-oss 正式上线微软 Foundry 平台
  • [Oracle] CEIL()函数
  • 利用微软SQL Server数据库管理员(SA)口令为空的攻击活动猖獗
  • MySQL中的DDL(一)
  • 直连微软,下载速度达18M/S