predicate接口专注封装“输入→布尔值”的判断逻辑,核心是test()方法;支持and/or/negate组合条件;常用于stream.filter过滤、业务校验等场景,提升代码可读性与复用性。

Predicate 接口本身不执行分支逻辑,而是专注做一件事:给一个输入,返回 true 或 false。它把“是否满足条件”这个判断动作封装成可复用、可传递的对象,真正触发执行(比如过滤、跳转、校验)还得靠 filter、if、test() 调用等外部操作。
核心方法 test(T t):最直接的判断入口
所有 Predicate 的判断能力都来自 test() 方法。它接收一个参数,按你定义的规则计算并返回布尔值:
- Predicate
isNotBlank = s -> s != null && !s.trim().isEmpty(); - boolean result = isNotBlank.test(" hello "); // true
- boolean result2 = isNotBlank.test(""); // false
你可以把它当作一个“即插即用”的判断器,传哪儿都能调用 test() 得到结果。
组合多个条件:and / or / negate
现实中的业务规则往往不是单个条件,Predicate 提供了无需写 if 嵌套就能拼接逻辑的方式:
- Predicate
isEven = n -> n % 2 == 0; - Predicate
isGreaterThan10 = n -> n > 10; - Predicate
both = isEven.and(isGreaterThan10); // 等价于 n -> n % 2 == 0 && n > 10 - Predicate
either = isEven.or(isGreaterThan10); // 或关系 - Predicate
notEven = isEven.negate(); // 取反,即奇数
这些组合返回的仍是 Predicate,可以继续链式调用,也支持多次复用。
配合 Stream 过滤:让判断自动批量执行
Predicate 最常见的落地场景是和 Stream.filter() 配合,把判断逻辑从循环里解耦出来:
- List
words = Arrays.asList("cat", "dog", "elephant", "ant"); - Predicate
longWord = s -> s.length() > 4; - List
filtered = words.stream().filter(longWord).collect(Collectors.toList()); - // 结果:["elephant"]
这里 filter() 内部就反复调用你的 longWord.test(...),你只管定义“什么样算长”,不用操心怎么遍历。
用于业务校验或策略分支:配合 if 更清晰
当需要根据判断结果走不同流程时,Predicate 可作为语义明确的判断依据:
- Predicate
isAdult = u -> u.getAge() >= 18; - Predicate
isActive = u -> Boolean.TRUE.equals(u.getActive()); - Predicate
canAccess = isAdult.and(isActive); - if (canAccess.test(user)) { grantPermission(); } else { denyAccess(); }
比起直接写 if (user.getAge() >= 18 && user.getActive()),这种方式把规则命名化、模块化,后续修改、测试、替换都更方便。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











