Predicate是Java 8引入的函数式接口,用于单参数布尔判断,核心方法test()返回true或false,支持and/or/negate组合及Stream.filter过滤。

Predicate 是 Java 8 引入的核心函数式接口,专用于单参数的布尔判断(即“断言”),本质就是封装一个 test(T) 逻辑,返回 true 或 false。它不执行业务动作,只回答“是否满足条件”,因此天然适合过滤、校验、路由决策等场景。
用 test() 执行最基础的条件判断
所有 Predicate 实例都必须实现 test() 方法,这是它的核心行为:
- 输入一个泛型参数
T,例如字符串、用户对象或整数 - 内部写任意合法 Java 表达式或方法调用,只要最终能得出布尔结果
- 返回
true表示“断言通过”,false表示“不满足条件”
示例:
Predicate<String> isLong = s -> s != null && s.length() > 5;<br>
System.out.println(isLong.test("Hello")); // false(长度=5)<br>
System.out.println(isLong.test("Hello!")); // true(长度=6)
用 and / or / negate 组合多个断言
单个判断往往不够,Predicate 提供了三个默认方法,支持链式组合,语义清晰且不改变原逻辑:
-
and(Predicate):逻辑与,两个条件都为true才返回true -
or(Predicate):逻辑或,任一为true就返回true -
negate():取反,生成一个新 Predicate,行为等价于!original.test(t),原谓词不受影响
示例:
Predicate<String> nonEmpty = s -> s != null && !s.trim().isEmpty();<br> Predicate<String> shortEnough = s -> s.length() <= 10;<br> Predicate<String> valid = nonEmpty.and(shortEnough);<br> Predicate<String> invalid = valid.negate(); // 等价于 “为空 或 长度超10”
在 Stream 中做数据过滤最常见
Predicate 是 Stream.filter() 的唯一参数类型,把判断逻辑从循环中解耦出来:
立即学习“Java免费学习笔记(深入)”;
- 避免手写
if块 +list.add()的模板代码 - 可复用谓词变量,比如
isAdult、isActive可在多处 filter 中复用 - 配合方法引用更简洁,如
Stream.filter(Objects::nonNull)
示例:
List<User> adults = users.stream()<br>
.filter(u -> u != null && u.getAge() >= 18)<br>
.collect(Collectors.toList());可重构为:
Predicate<User> isAdult = u -> u != null && u.getAge() >= 18;<br> List<User> adults = users.stream().filter(isAdult).collect(...);
注意 null 安全和可读性设计
断言逻辑若涉及 null,需主动处理,否则可能抛 NullPointerException:
- 推荐用
Objects::nonNull或显式判空作为组合起点 - 避免在
negate()后再嵌套复杂表达式,比如a.negate().or(b).negate()容易绕晕 - Java 11 起可用静态方法
Predicate.not(p)替代p.negate(),语义更直白
好习惯示例:
Predicate<User> notBlocked = u -> !Status.BLOCKED.equals(u.getStatus());<br>
Predicate<User> activeAdult = Objects::nonNull<br>
.and(u -> u.getAge() >= 18)<br>
.and(notBlocked);


















