Lambda校验的核心是将规则封装为有业务语义的Predicate,支持组合、上下文追踪与依赖注入,并通过统一装饰器增强日志、异常和监控能力。

用 Lambda 表达式做变量校验,关键不是把 if 拆成一行,而是把“规则”变成可命名、可组合、可追踪的契约单元。核心目标是让每条校验逻辑有业务语义、不耦合执行副作用、失败时能准确定位——这样才真正减少重复和维护成本。
用 Predicate 封装带业务名的原子规则
每个校验对应一个 Predicate,命名直接体现业务含义,比如:
-
isNonBlankName→s -> s != null && !s.trim().isEmpty() -
isEmailFormat→s -> s != null && EMAIL_PATTERN.matcher(s).matches() -
isAgeInRange→i -> i >= 1 && i
避免泛泛叫 isValid 或在内部抛异常——Predicate 只返回 true/false,职责单一,便于测试和复用。
组合多条规则并保留失败上下文
不用 and() 链式调用,因为它失败时无法知道哪一环出问题。改用元组结构记录规则与提示:
- 定义
List存校验项和错误消息, String>> - 遍历时逐个执行,第一个返回
false的就立即返回对应提示,如“姓名不能为空”“邮箱格式不合法” - 支持按需跳过某些规则(如仅新增用户时校验唯一性),无需修改主流程
通过工厂方法注入动态依赖
需要查库或比对旧值的校验,不能把 UserRepository 或 oldPassword 写死在 Lambda 里。应封装为工厂方法:
PredicateuniqueUsername = uniqueCheckFactory(userRepo); - 工厂内部捕获依赖,返回闭包式 Predicate:
username -> !userRepo.existsByUsername(username) - 测试时可传入 mock repo,不破坏函数式风格
统一装饰增强:日志、异常、追踪一体化
原始 Predicate 不处理副作用。上线前加一层通用包装器,例如 ValidatingPredicate:
- 构造时接收原始 Predicate + 错误码 + 消息模板 + 请求 ID 上下文
- 执行失败时自动记录结构化日志,并抛出含堆栈、字段名、请求 ID 的
ValidationException - 所有校验走同一入口,异常格式、监控埋点、告警阈值都集中管控










