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;</string>,调用isLong.test("Hello!")返回 true -
检查整数是否为正数:
Predicate<integer> isPositive = x -> x > 0;</integer>,isPositive.test(-3)返回 false -
匹配以特定字母开头:
Predicate<string> startsWithB = s -> s.startsWith("B");</string>
用 and/or/negate 组合多个条件
Predicate 提供了默认方法,支持像写自然语言一样拼接逻辑,且具备短路特性(类似 && 和 ||):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
and:同时满足两个条件 ——
Predicate<string> longAndStartH = isLong.and(startsWithH);</string>,若isLong返回 false,startsWithH不执行 -
or:满足任一即可 ——
Predicate<string> shortOrEndsD = s->s.length()s.endsWith("d"));</string> -
negate:取反 ——
Predicate<string> notLong = isLong.negate();</string>,等价于s -> s.length()
配合 Stream.filter 或 Collection.removeIf 使用
Predicate 的真正价值体现在数据处理链中,无需手写循环:
-
流过滤:
List<string> result = list.stream().filter(s -> s.contains("a") && s.length() > 3).collect(Collectors.toList());</string>,其中 Lambda 就是隐式构造的 Predicate -
原地删除:
names.removeIf(name -> name.startsWith("A") || name.length() ,比遍历 + if + remove 更安全高效 -
自定义筛选工具方法:
public static <t> List<t> filter(List<t> list, Predicate<t> p) { return list.stream().filter(p).collect(Collectors.toList()); }</t></t></t></t>
用 isEqual 简化对象相等性判断
静态方法 Predicate.isEqual(obj) 可避免空指针风险,内部已处理 null 情况:
-
Predicate<string> isAlice = Predicate.isEqual("Alice");</string>,调用isAlice.test(null)安全返回 false - 等效于手动写:
s -> "Alice".equals(s),但更健壮、更语义化 - 适合在 Map 查找、去重或断言测试中复用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










