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

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


















