谓词(Predicate)通过拆分独立条件、组合and/or及取反negate实现清晰业务判断。每个谓词职责单一可复用,and用于全量守门,or用于任一放行,negate使否定逻辑更直白,混合使用时需括号明确优先级。

Predicate 在业务判断中组合与取反,核心是把零散条件拆成独立、可复用的谓词,再用 and、or、negate 拼装出语义清晰的逻辑,避免写满屏的 && 和 ||。
拆成小谓词,每个只管一件事
业务校验往往涉及多个维度,比如用户登录前要检查:是否激活、邮箱非空、年龄达标。与其在 filter 里堆逻辑,不如提前定义好:
Predicate<User> isActive = u -> u.getStatus() == Status.ACTIVE;Predicate<User> hasValidEmail = u -> u.getEmail() != null && u.getEmail().contains("@");Predicate<User> isAdult = u -> u.getAge() >= 18;
这样每个谓词职责单一,能单独单元测试,也能在不同场景复用(比如注册、修改资料都可能用到 hasValidEmail)。
and 表示“全都要”,适合守门场景
当所有条件必须同时满足时,用 and() 组合。它短路执行——前面一个返回 false,后面的就不会调用,能防空指针或跳过耗时操作。
立即学习“Java免费学习笔记(深入)”;
Predicate<User> canLogin = isActive.and(hasValidEmail).and(isAdult);- 等价于:
u -> isActive.test(u) && hasValidEmail.test(u) && isAdult.test(u) - 适合登录校验、订单提交前检查、数据入库前验证等“全量守门”环节
or 表示“任一即可”,适合兜底或权限放行
当满足任意一个条件就允许通过时,用 or()。它也是短路的——左边为 true,右边就不执行。
Predicate<Order> shouldCache = isVIP.or(orderAmountOver500);Predicate<Resource> canAccess = isAdmin.or(isOwner).or(hasPermission("READ"));- 注意:连续用多个
or语义没问题,但超过 3 个建议提取中间变量,否则可读性下降
negate 实现“取反”,让否定逻辑更直白
不用写 !predicate.test(x),直接调用 negate(),语义更明确,也方便链式组合。
-
Predicate<String> isNotEmpty = s -> !s.isBlank();→ 可改写为Predicate<String> isBlank = s -> s.isBlank(); Predicate<String> isNotEmpty = isBlank.negate(); - 还能嵌套:比如“不是 VIP 且消费不足 1000 元”可写成
vip.negate().and(spentOver1000.negate()) - 和
and/or混用时加括号明确优先级,例如:vip.or(normalUser.and(spentOver1000.negate()))


















