java 中可以使用 predicate 接口自带的 and() 方法将多个条件组合成一个新的 predicate,从而在流处理或过滤操作中实现“且”逻辑。具体做法是调用第一个谓词的 .and(第二个谓词),返回的复合谓词会在两个条件都为真时才返回 true。如果任意一个输入为 null,调用链会抛出 nullpointerexception,因此需确保谓词实例非空。

如何对 List 进行多条件过滤
可以直接使用 stream().filter(predicate.and(other)) 来过滤列表。例如,筛选出长度大于 3 且以 "a" 开头的字符串。这种写法避免了创建匿名内部类,代码更简洁。

import java.util.*;
import java.util.function.Predicate;
public class Main {
public static void main(String[] args) {
List<string> list = Arrays.asList("apple", "bat", "ant", "cat", "dog");
Predicate<string> lengthCheck = s -> s.length() > 3;
Predicate<string> startCheck = s -> s.startsWith("a");
// 组合条件
Predicate<string> combined = lengthCheck.and(startCheck);
List<string> result = list.stream()
.filter(combined)
.collect(Collectors.toList());
System.out.println(result); // [apple, ant]
}
}</string></string></string></string></string>
如何处理空值导致的 NullPointerException
当参与 and 操作的谓词之一为 null 时,直接调用会报错。可以通过包装一个安全谓词或使用 Optional 风格的处理来避免。例如,定义一个 nullSafePredicate 来包裹原始逻辑。

import java.util.function.Predicate;
public class SafePredicateExample {
public static void main(String[] args) {
Predicate<string> safeLength = s -> s != null && s.length() > 3;
Predicate<string> safeStart = s -> s != null && s.startsWith("a");
// 即使其中一个为 null,只要另一个不为 null 且逻辑正确,就不会抛异常
// 但注意:如果直接调用 null.and(...) 仍会抛异常
Predicate<string> combined = safeLength.and(safeStart);
System.out.println(combined.test("apple")); // true
System.out.println(combined.test(null)); // false (因为 safeLength 内部处理了 null)
}
}</string></string></string>
基于输入 "null" 和 and 组合的具体行为
当输入为 null 时,如果组合后的谓词内部没有显式处理 null,通常会抛出 NullPointerException。例如,若直接使用 s -> s.length() > 3 作为第一个谓词,调用 test(null) 会崩溃。因此,在使用 and 组合前,务必确保每个谓词都能妥善处理 null 输入,或者在组合后统一检查 null。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











