Predicate 是 Java 8 提供的函数式接口,用于条件判断并返回布尔值,支持 test() 方法、and/or/negate 逻辑组合、Stream.filter/removeIf 集成、isEqual 空安全相等判断。

Predicate 是 Java 8 引入的核心函数式接口之一,专用于“条件判断”,输入一个值,返回 true 或 false。它最常出现在集合过滤、流操作和逻辑组合场景中,写法简洁,语义清晰。
定义并使用 test() 方法做基础判断
test() 是 Predicate 唯一的抽象方法,所有逻辑都围绕它展开。你可以用 Lambda 表达式快速实现:
-
判断字符串长度是否超过 5:
Predicate<String> isLong = s -> s.length() > 5;,调用isLong.test("Hello!")返回 true -
检查整数是否为正数:
Predicate<Integer> isPositive = x -> x > 0;,isPositive.test(-3)返回 false -
匹配以特定字母开头:
Predicate<String> startsWithB = s -> s.startsWith("B");
用 and/or/negate 组合多个条件
Predicate 提供了默认方法,支持像写自然语言一样拼接逻辑,且具备短路特性(类似 && 和 ||):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
and:同时满足两个条件 ——
Predicate<String> longAndStartH = isLong.and(startsWithH);,若isLong返回 false,startsWithH不执行 -
or:满足任一即可 ——
Predicate<String> shortOrEndsD = s->s.length()<4 .or(s->s.endsWith("d")); -
negate:取反 ——
Predicate<String> notLong = isLong.negate();,等价于s -> s.length() <= 5
配合 Stream.filter 或 Collection.removeIf 使用
Predicate 的真正价值体现在数据处理链中,无需手写循环:
立即学习“Java免费学习笔记(深入)”;
-
流过滤:
List<String> result = list.stream().filter(s -> s.contains("a") && s.length() > 3).collect(Collectors.toList());,其中 Lambda 就是隐式构造的 Predicate -
原地删除:
names.removeIf(name -> name.startsWith("A") || name.length() < 2);,比遍历 + if + remove 更安全高效 -
自定义筛选工具方法:
public static <T> List<T> filter(List<T> list, Predicate<T> p) { return list.stream().filter(p).collect(Collectors.toList()); }
用 isEqual 简化对象相等性判断
静态方法 Predicate.isEqual(obj) 可避免空指针风险,内部已处理 null 情况:
-
Predicate<String> isAlice = Predicate.isEqual("Alice");,调用isAlice.test(null)安全返回 false - 等效于手动写:
s -> "Alice".equals(s),但更健壮、更语义化 - 适合在 Map 查找、去重或断言测试中复用

















