predicate是java 8函数式接口,封装“输入对象返回布尔值”的断言逻辑,含test()方法及and/or/negate组合能力,支持lambda定义、链式拼接、嵌套复用与null安全处理。

Predicate 是 Java 8 引入的函数式接口,用于封装“输入一个对象,返回布尔值”的逻辑,本质就是断言判断。它只有一个抽象方法 test(T t),天然适配 lambda 表达式,非常适合做条件筛选、规则校验和多条件组合。
基础断言:用 lambda 快速定义判断逻辑
直接传入 lambda 即可创建 Predicate 实例,无需额外类或匿名内部类:
Predicate<string> isNotEmpty = s -> s != null && !s.trim().isEmpty();</string>Predicate<integer> isEven = n -> n % 2 == 0;</integer>Predicate<person> isAdult = p -> p.getAge() >= 18;</person>
调用 test() 方法即可执行判断:isEven.test(4) 返回 true。
多条件组合:用 and/or/negate 链式拼接
Predicate 内置了三个默认方法,支持安全、可读性强的逻辑组合,避免手写冗长的 if 判断:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
and():逻辑与(&&),两个条件都为 true 才返回 true -
or():逻辑或(||),任一为 true 就返回 true -
negate():逻辑非(!),取反结果
例如,筛选“年龄 ≥ 18 且名字不为空”的用户:
Predicate<person> isAdult = p -> p.getAge() >= 18;
Predicate<person> hasName = p -> p.getName() != null && !p.getName().trim().isEmpty();
Predicate<person> validUser = isAdult.and(hasName);
List<person> adults = people.stream()
.filter(validUser)
.collect(Collectors.toList());</person></person></person></person>
嵌套与复用:把复杂条件拆解成可测试的小单元
把每个业务含义明确的判断单独定义为 Predicate 变量,既利于单元测试,也方便组合复用:
Predicate<order> isPaid = o -> "PAID".equals(o.getStatus());</order>Predicate<order> isDomestic = o -> "CN".equals(o.getCountryCode());</order>Predicate<order> isUrgent = o -> o.getPriority() > 5;</order>Predicate<order> eligibleForFreeShipping = isPaid.and(isDomestic).and(isUrgent.negate());</order>
这样修改某个子条件(比如国家码判断升级为白名单)时,只改对应 Predicate,不影响其他逻辑。
注意 null 安全与短路行为
Predicate 组合是惰性求值的,and() 和 or() 遵循短路语义 —— 前面条件已能确定结果时,后续条件不会执行。但需主动处理 null:
- 不要直接对可能为 null 的对象调用方法,比如
p.getName().length() > 0会 NPE - 应先判空:
p -> p != null && p.getName() != null && p.getName().length() > 0 - 或用
Objects.nonNull()辅助:p -> Objects.nonNull(p) && Objects.nonNull(p.getName()) && !p.getName().isEmpty()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










