predicate.and()用于逻辑与组合,返回新predicate,仅当所有条件均为true时结果为true;支持链式调用实现多条件组合,具备短路特性且不修改原对象。

Predicate.and 方法用于将两个条件逻辑“与”组合,返回一个新的 Predicate,只有当两个条件都为 true 时,组合后的结果才为 true。它不直接支持多个条件一次性传入,但可通过链式调用实现多条件组合。
and 方法的基本行为
其签名是:default Predicate<t> and(Predicate super T> other)</t>
内部本质是:对同一输入 t,先执行当前 Predicate 的 test(t),再执行 other.test(t),两者都返回 true 才整体返回 true。
链式调用实现多条件组合
Java 中没有内置的 and(Predicate...) 可变参数方法,但可以连续调用 and 实现任意数量的“与”逻辑:
- 从一个基础条件开始(如
Predicate<string> nonEmpty = s -> s != null && !s.trim().isEmpty();</string>) - 逐个用
and连接其他条件:Predicate<string> valid = nonEmpty<br> .and(s -> s.length() >= 5)<br> .and(s -> s.chars().anyMatch(Character::isUpperCase))<br> .and(s -> s.contains("_"));</string> - 最终
valid.test("My_Name")返回true,而valid.test("hello")返回false
注意短路与空安全
and 是**短路求值**的:如果前一个条件已返回 false,后续条件不会执行。这有助于避免空指针或冗余计算:
- 例如:
Objects::nonNull.and(s -> s.length() > 0),若输入为null,第二个条件根本不会触发 - 但要注意:每个
Predicate自身需保证线程安全(无共享可变状态),且不要在test中做副作用操作(如修改外部变量、IO)
替代写法:用静态工具方法封装多条件
若频繁使用多个条件组合,可自定义一个工具方法提升可读性:
public static <t> Predicate<t> andAll(Predicate<t>... predicates) {
return Arrays.stream(predicates)
.reduce(t -> true, Predicate::and);
}</t></t></t>
用法:Predicate<integer> rangeCheck = andAll(x -> x > 0, x -> x x % 2 == 0);</integer>
该写法语义更清晰,底层仍是链式 and 调用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











