Lambda表达式校验核心是将“校验行为”变为可传递、可组合、可复用的一等公民,通过Predicate封装带语义的校验单元,剥离业务字段与硬编码判断。

用Lambda表达式做变量校验,核心不是写得更短,而是把“校验行为”变成可传递、可组合、可复用的一等公民。关键在于剥离具体业务字段和硬编码判断,让校验逻辑本身具备语义和上下文感知能力。
用Predicate封装带语义的校验单元
别再写if (user.getAge() 这种散落在各处的判断。统一用Predicate抽象:每个校验对应一个有名字、有输入、返回布尔值的函数对象。
- 定义清晰命名的静态校验器,例如
Validators.NOT_NULL、Validators.POSITIVE_NUMBER - 每个
Predicate只专注一个职责,比如u -> u.getPhone() != null && u.getPhone().matches("^1[3-9]\d{9}$")就是一个独立的“手机号格式校验”单元 - 配合Lombok的
@UtilityClass或@Component管理,便于Spring注入或静态调用
用Map组织校验规则,支持动态装配
把校验器注册进Map,键是业务标识(如"user_age_must_be_positive"),值是对应Lambda。启动时用@PostConstruct初始化,运行时按需拉取。
- 避免if-else堆砌:不再需要
if ("age".equals(field)) { ... } else if ("email".equals(field)) { ... } - 新增校验只需加一条map entry,不改原有流程;前端传
ruleCode=user_email_format,后端直接rules.get(ruleCode).test(obj) - 支持组合:用
and()/or()方法链式拼接多个Predicate,比如NOT_NULL.and(EMAIL_PATTERN)
用Function+Consumer增强反馈能力
纯Predicate只能回答“对/错”,但真实业务需要“为什么错”。这时可用Function替代:
-
ValidationResult包含isValid、errorCode、message字段 - 每个Lambda内部自行构造结果,例如
u -> u.getAge() - 配合
Consumer做统一错误收集或日志记录,实现校验与通知解耦
结合上下文参数提升灵活性
很多校验依赖外部条件,比如“结束时间不能早于当前时间+2小时”。Lambda的捕获机制天然支持:
- 声明
LocalDateTime threshold = LocalDateTime.now().plusHours(2); - 校验器写成
(event) -> event.getEndTime().isAfter(threshold) - 阈值可随请求动态计算,也可从配置中心加载,无需修改校验逻辑本身










