Java中函数式接口AssertRule通过and方法链式组合断言,实现多校验逻辑依次执行、任一失败即抛带业务上下文的异常;相比嵌套if、裸assert和手动throw,更清晰、可控且可复用。

Java 中函数式接口配合 and 方法组合断言,本质是把多个校验逻辑“串起来”,让它们依次执行、任一失败即中断,并抛出带业务上下文的异常。这种方式比嵌套 if 更清晰,比原始 assert 更可控,也比手动 throw 更可复用。
用自定义 AssertRule<T> 替代裸 assert
直接写 assert obj != null 只能在开发期启用(需 -ea),且无法携带字段名、不支持链式、不能统一管理错误提示。而自定义函数式接口能解决这些问题:
@FunctionalInterface
public interface AssertRule<T> {
void check(T value) throws IllegalArgumentException;
default AssertRule<T> and(AssertRule<T> other) {
return t -> {
this.check(t);
other.check(t);
};
}
}check() 方法直接抛异常,语义明确:这不是判断,是守门;and() 是默认方法,返回新规则,天然支持链式。
常见校验封装成静态工厂方法
把高频检查抽象为可复用的 AssertRule 实例,调用时像拼积木:
立即学习“Java免费学习笔记(深入)”;
-
AssertRule.notNull("用户名") -
AssertRule.lengthBetween(2, 20).on(String::length) -
AssertRule.matches("[a-zA-Z0-9_]+").on(Function.identity()) -
AssertRule.unique(User::getEmail, userService::existsByEmail)
每个方法都返回 AssertRule<T>,所以能连续 .and(...)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
例如用户名校验:
AssertRule<String> usernameRule = AssertRule.notNull("用户名")
.and(AssertRule.lengthBetween(2, 20).on(String::length))
.and(AssertRule.matches("[a-zA-Z0-9_]+"));
usernameRule.check(dto.getUsername()); // 任一不满足,立即抛 IllegalArgumentException,消息含字段名和规则和业务方法安全集成,不污染主逻辑
在 Service 入口集中断言,核心流程保持干净:
public User create(UserDTO dto) {
// 一行完成多维度校验
usernameRule.check(dto.getUsername());
emailRule.check(dto.getEmail());
// 后续全是纯业务逻辑:构造、持久化、发事件……无 if 嵌套
return userRepository.save(new User(dto));
}也可以提前组合好规则对象,甚至按场景预定义:
private static final AssertRule<String> LOGIN_NAME_RULE =
AssertRule.notNull("登录名")
.and(AssertRule.lengthBetween(3, 16))
.and(AssertRule.matches("[a-z0-9_]+"));和内置 Predicate 的关键区别
| 项目 | Predicate<T> |
AssertRule<T> |
|---|---|---|
| 行为语义 | “是否满足条件” → 返回 boolean
|
“必须成立,否则报错” → 直接 throw
|
| 错误定位 | 需额外包装才能带提示 | 每个规则自带字段名和规则描述 |
| 组合目的 | 过滤、分支判断 | 防御式拦截,强调失败即终止 |
| 适用阶段 | 运行时通用逻辑判断 | 业务入口参数校验(开发+生产均生效) |
Predicate.and() 返回新 Predicate,仍要你自己写 if (!p.test(x)) throw ...;而 AssertRule.and() 组合后调用 check() 就自动完成“校验+报错”全流程。
不复杂但容易忽略:真正提升质量的不是写多少校验,而是让校验可读、可复用、可组合、有上下文。

















