Stream API 谓词筛选器的核心是将独立条件封装为 Predicate 实例,再通过 and()、or()、negate() 组合复用;拆解条件便于测试与理解,支持动态组装、参数化工厂及延迟优化。

用 Stream API 实现基于谓词组合的变量筛选器,核心在于把多个独立条件封装为 Predicate 实例,再通过 and()、or()、negate() 组装成可复用、可测试、可读性强的逻辑单元,而不是堆砌一长串 Lambda 表达式。
拆解条件为独立 Predicate
每个业务条件单独定义为一个 Predicate,便于理解、复用和单元测试。例如:
-
年龄合规:
Predicate<User> isAdult = u -> u.getAge() >= 18; -
状态有效:
Predicate<User> isActive = u -> "ACTIVE".equals(u.getStatus()); -
邮箱规范:
Predicate<User> hasValidEmail = u -> u.getEmail() != null && u.getEmail().matches("^[^@]+@[^@]+\.[^@]+$");
组合谓词构建复合筛选逻辑
使用函数式接口原生方法拼接,避免嵌套 if 或冗长的单行判断:
- 同时满足(且):
isAdult.and(isActive).and(hasValidEmail) - 满足其一(或):
isAdult.or(hasValidEmail) - 取反(非):
isActive.negate()(即非激活用户) - 多层组合示例:
isAdult.and(isActive).or(hasValidEmail.and(isAdult.negate()))(成年人且激活,或非成年人但有有效邮箱)
结合流操作完成筛选
将组合后的谓词传入 filter(),注意保持链式调用的清晰性:
- 基础用法:
users.stream().filter(compositePredicate).collect(Collectors.toList()); - 配合延迟计算优化:若某条件开销大(如远程校验),应后置;高选择性条件(如 ID 精确匹配)优先前置。
- 支持动态组装:可将 Predicate 存入 Map 或 List,运行时按需合并,适合规则引擎场景。
扩展:支持参数化与复用的谓词工厂
避免硬编码值,用方法返回带参 Predicate:
static Predicate<Employee> salaryAbove(double threshold) { return e -> e.getSalary() > threshold; }static Predicate<String> startsWithIgnoreCase(String prefix) { return s -> s != null && s.toLowerCase().startsWith(prefix.toLowerCase()); }- 调用:
employees.stream().filter(salaryAbove(15000)).filter(startsWithIgnoreCase("dev")).collect(...);


















