Predicate 是 Java 8 提供的函数式接口,用于封装返回 boolean 的判断逻辑,支持 lambda 简洁定义、test() 执行验证及 and/or/negate 组合条件,并强调可读性、复用性与 null 安全。

Predicate 是 Java 8 引入的核心函数式接口,专用于“输入一个值,返回 true 或 false”的判断逻辑。它不负责执行动作,只做条件表达——比如校验、筛选、规则匹配,天然适配 Lambda,写法简洁,组合灵活。
用 lambda 快速定义单个判断逻辑
只需一行 lambda 就能创建 Predicate 实例,无需匿名类或额外类:
-
判断字符串非空:
Predicate<String> isNotEmpty = s -> s != null && !s.trim().isEmpty(); -
判断整数为偶数:
Predicate<Integer> isEven = n -> n % 2 == 0; -
判断用户成年:
Predicate<Person> isAdult = p -> p.getAge() >= 18;
调用 test() 即可验证:isEven.test(6) 返回 true,isAdult.test(new Person("Alice", 17)) 返回 false。
用 and/or/negate 组合多个条件
Predicate 内置三个默认方法,支持安全、可读的逻辑拼接,且自带短路行为(类似 && 和 ||):
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- and() 表示“且”:两个条件都满足才为 true;若前一个返回 false,后一个不会执行(避免空指针等副作用)
- or() 表示“或”:任一为 true 即返回 true;若前一个已为 true,后一个跳过
-
negate() 表示“非”:对原结果取反,常用于反转语义,如
isAdult.negate()等价于isMinor
例如筛选“已支付 + 国内订单 + 非紧急”:
Predicate<Order> eligible = isPaid.and(isDomestic).and(isUrgent.negate());
拆解复用,提升可维护性
把每个有明确业务含义的判断单独定义为变量,而不是堆砌长表达式:
- 每个 Predicate 可独立单元测试
- 修改某条规则(如国家码从单值判断升级为白名单)只需改对应变量,不影响其他组合
- 命名即文档,如
hasValidEmail、meetsCreditScore比内联 lambda 更易懂
实际中常见于数据导入校验、API 参数预检、Stream 过滤等场景。
注意 null 安全与静态辅助方法
直接在 lambda 中判空容易遗漏,推荐结合 Objects::nonNull 或 Predicate.isEqual():
Predicate<String> notNull = Objects::nonNull;-
Predicate<String> equalsHello = Predicate.isEqual("Hello");(自动处理 null,比s -> "Hello".equals(s)更健壮) - 组合时建议先判空再业务逻辑,例如:
notNull.and(isLong)

















