Java Stream断言匹配结果获取及ValidatorAggregator实现技术问询
问题2:实现支持OR逻辑的ValidatorAggregator
首先咱们先明确一下基础类的结构(假设这些是你已经定义好的):
// 待验证的对象 class Thing {} // 验证结果类,包含是否有效和原因 class ValidationResult { private final boolean valid; private final String reason; public ValidationResult(boolean valid, String reason) { this.valid = valid; this.reason = reason; } public boolean isValid() { return valid; } public String getReason() { return reason; } // 静态工厂方法,方便创建结果 public static ValidationResult success(String reason) { return new ValidationResult(true, reason); } public static ValidationResult failure(String reason) { return new ValidationResult(false, reason); } } // 已有的Validator接口 interface Validator { ValidationResult isValid(Thing thing); }
接下来实现ValidatorAggregator,核心要做到两点:短路返回成功结果、收集所有失败原因(如果全失败)。直接看代码:
import java.util.List; import java.util.ArrayList; public class ValidatorAggregator implements Validator { private final List<Validator> validators; // 构造器传入要聚合的所有Validator public ValidatorAggregator(List<Validator> validators) { this.validators = validators; } @Override public ValidationResult isValid(Thing thing) { List<String> failureReasons = new ArrayList<>(); // 遍历所有Validator,一次遍历完成所有逻辑 for (Validator validator : validators) { ValidationResult result = validator.isValid(thing); if (result.isValid()) { // 找到第一个成功的验证,直接返回,短路后续操作 return result; } // 失败的话记录原因 failureReasons.add(result.getReason()); } // 所有验证都失败了,拼接所有原因返回 String combinedReason = String.join("; ", failureReasons); return ValidationResult.failure("所有验证未通过:" + combinedReason); } }
这个实现的优点:
- 短路逻辑:只要有一个Validator验证成功,立刻返回,不会执行后续验证,性能更好
- 一次遍历:只遍历一次Validator列表,避免重复调用验证方法(如果验证逻辑比较耗时,这点很重要)
- 清晰的失败信息:把所有失败原因拼接起来,方便排查问题或者给用户反馈
- 扩展性好:通过构造器传入Validator列表,要加新的验证逻辑直接传新的Validator就行,符合开闭原则
内容的提问来源于stack exchange,提问作者Rik
相关产品推荐
相关产品推荐

