Predicate.isEqual 是 Java 8 提供的 null 安全、线程安全的静态方法,基于 equals() 创建等值谓词,支持函数式组合与自定义对象(需正确实现 equals)。

Predicate.isEqual 是 Java 8 引入的便捷静态方法,用于创建一个可复用、线程安全的谓词(Predicate),专门做“与指定对象相等”的判定。它内部基于 equals() 方法比较,自动处理 null 安全性,比手写 lambda 更简洁、更健壮。
避免 null 异常,无需手动判空
直接用 Predicate.isEqual(obj) 创建的谓词,在接收 null 输入时不会抛出 NullPointerException。它会按语义正确处理:当目标对象为 null 时,只对输入也为 null 返回 true;否则调用 obj.equals(input)。
- ✅ 正确:
Predicate<string> isHello = Predicate.isEqual("hello"); isHello.test(null); // false</string> - ✅ 安全:
Predicate<string> isNull = Predicate.isEqual(null); isNull.test(null); // true</string> - ❌ 危险:
s -> "hello".equals(s)虽也安全,但重复写易出错;s -> s.equals("hello")在s为null时直接崩溃
替代冗余的 lambda 表达式
在 filter、findAny、removeIf 等场景中,频繁判断是否等于某值时,用 isEqual 可提升可读性和一致性。
- 过滤集合中等于某个用户:
list.stream().filter(Predicate.isEqual(targetUser)).findFirst(); - 从 Set 中移除特定元素:
userSet.removeIf(Predicate.isEqual(inactiveUser)); - 匹配 Map 的 key:
map.keySet().stream().filter(Predicate.isEqual("status")).findFirst();
配合 and/or/negate 组合逻辑更清晰
因为返回的是标准 Predicate,天然支持函数式组合,比嵌套三元或多重 if 更直观。
- 查找非空且等于某值的字符串:
Predicate<string> isNotNullAndHello = Predicate.isEqual("hello").and(Objects::nonNull);</string> - 排除某个特定对象:
list.removeIf(Predicate.isEqual(bannedItem).negate());(注意:通常应直接用isEqual+removeIf,此处仅示意 negation) - 多个等值条件联合:
Predicate<user> isAliceOrBob = Predicate.isEqual(alice).or(Predicate.isEqual(bob));</user>
适用于自定义对象,但需确保 equals 实现正确
isEqual 依赖对象自身的 equals() 方法。若用于自定义类(如 Person),必须已正确定义 equals(及配套 hashCode)。
- ✅ 有效前提:
public class Person { ... @Override public boolean equals(Object o) { ... } } - ⚠️ 注意:若未重写
equals,默认使用Object.equals(即引用比较),此时isEqual行为等同于==,可能不符合预期 - ? 提示:配合 Lombok 的
@EqualsAndHashCode可快速生成正确实现

















