Predicate接口的test方法是条件判断的核心执行入口,仅执行一次布尔计算,接收一个泛型参数并返回boolean,所有逻辑(如判空、范围检查)需手动定义,不自动容错。

Predicate 接口的 test 方法就是条件判断的核心执行入口,它不负责定义逻辑,而是运行你写好的判断规则,并返回 true 或 false。关键在于:怎么写这个规则,以及怎么安全、清晰地用它。
test 方法本质是“执行一次布尔计算”
它只有一个参数 T t,返回 boolean。你传什么类型进去,泛型 T 就是什么类型;它不做任何预处理,也不自动判空或容错——所有逻辑都由你通过 Lambda 或实现类来定义:
- 字符串长度判断:
Predicate<string> isLong = s -> s != null && s.length() > 5;</string>(必须手动判空,否则传入 null 会抛 NPE) - 用户年龄校验:
Predicate<user> isAdult = u -> u != null && u.getAge() >= 18;</user> - 数值范围检查:
Predicate<integer> inRange = n -> n != null && n >= 0 && n </integer>
test 要配合具体场景才真正起作用
单独调用 pre.test(obj) 只是做一次判断,实际价值体现在集合操作中:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 在
Stream.filter()中筛选符合条件的元素:list.stream().filter(isAdult).collect(Collectors.toList()) - 在
Collection.removeIf()中移除匹配项:users.removeIf(u -> u.getScore() (注意:这是「删掉满足条件的」,不是保留) - 封装为工具方法复用:
public static boolean isValidEmail(String email) { return emailPattern.test(email); }
避免常见陷阱
test 看似简单,但几个细节容易出错:
立即学习“Java免费学习笔记(深入)”;
- 泛型类型必须和输入对象一致,比如
Predicate<integer></integer>不能直接传 String - Lambda 内部若调用可能为 null 的方法(如
s.toUpperCase()),必须先判空 - 不要在 test 里做耗时操作(如 IO、远程调用),它会被反复执行,影响性能
- test 本身无状态,每次调用都是独立计算;如需缓存或上下文,得自己封装

















