Java中Predicate通过and、or、negate默认方法组合过滤条件,实现逻辑与、或、非的链式拼装,支持空值安全处理、短路求值及条件复用,避免手动嵌套判断。

Java 中通过 Predicate 实现组合过滤条件,核心在于利用其内置的默认方法(and、or、negate)将多个逻辑判断“拼装”成一个复合条件,无需手动写 if-else 或嵌套判断。
Predicate 组合的基本方式
Predicate<t></t> 是函数式接口,代表“对某个类型 T 的输入返回 boolean 值”的判断逻辑。它提供了三个关键默认方法用于组合:
-
and(Predicate other):逻辑与(&&),两个条件都为 true 才返回 true -
or(Predicate other):逻辑或(||),任一为 true 就返回 true -
negate():逻辑非(!),反转当前判断结果
实际组合示例(用户过滤场景)
假设有一个 User 类,需同时满足“年龄 ≥ 18”、“用户名不为空”、“邮箱包含 @”三个条件:
Predicate<User> adult = u -> u.getAge() >= 18;
Predicate<User> hasName = u -> u.getName() != null && !u.getName().trim().isEmpty();
Predicate<User> validEmail = u -> u.getEmail() != null && u.getEmail().contains("@");
// 组合成一个复合条件
Predicate<User> validUser = adult.and(hasName).and(validEmail);
// 使用
List<User> users = ...;
List<User> filtered = users.stream()
.filter(validUser)
.collect(Collectors.toList());
链式组合与复用技巧
组合条件可分步构建,也支持复用和动态扩展:
立即学习“Java免费学习笔记(深入)”;
- 把常用条件抽成静态常量或工具方法,比如
Predicate<user> ACTIVE_USER = u -> u.isActive();</user> - 运行时根据参数动态拼接:例如搜索功能中,姓名模糊匹配 + 状态筛选 + 时间范围,可逐个
.and(...)添加 - 注意短路行为:
and和or都是惰性求值,前面为 false 时不会执行后面的 predicate,提升效率
避免常见陷阱
组合时容易忽略的细节:
-
空值安全:每个子 predicate 内部需自行处理 null(如用
Objects.nonNull()),and/or不会自动规避 NPE - 顺序影响可读性:建议把开销小、易失败的条件放前面(如非空检查),利于快速剪枝
- 不要在组合中修改状态:Predicate 应保持无副作用,避免在 lambda 里更新变量或调用非纯方法



















