如何将多个Vavr Validation<Error, ?>合并为单个Validation<Error, Reference>
用Vavr合并多字段Validation为单个Validation<Seq, Reference>
核心思路
Vavr的Validation原生支持错误累积,针对超过8个字段的场景(Vavr内置Tuple/Function最多支持8个参数),可以通过分组合并+链式ap的方式实现所有字段验证结果的合并,同时收集所有错误信息。
实现步骤
假设你已有:
Reference类:包含10+字段的实体类,具备全参构造函数ReferenceValidator类:每个字段的验证方法返回Validation<String, TField>(错误为单条字符串)
方法:分组合并+ap链式调用
将字段拆分为多组(每组不超过8个),分别用Validation.combine合并每组验证结果,再通过ap将各组结果最终映射到Reference构造函数。
public class Reference { // 示例10个不同类型的字段 private final String field1; private final Integer field2; private final String field3; private final Double field4; private final Boolean field5; private final Long field6; private final Float field7; private final Short field8; private final Byte field9; private final Character field10; // 私有全参构造函数,强制通过工厂方法创建实例 private Reference(String field1, Integer field2, String field3, Double field4, Boolean field5, Long field6, Float field7, Short field8, Byte field9, Character field10) { this.field1 = field1; this.field2 = field2; this.field3 = field3; this.field4 = field4; this.field5 = field5; this.field6 = field6; this.field7 = field7; this.field8 = field8; this.field9 = field9; this.field10 = field10; } public static Validation<Seq<String>, Reference> of( String input1, Integer input2, String input3, Double input4, Boolean input5, Long input6, Float input7, Short input8, Byte input9, Character input10 ) { // 1. 分组合并验证结果:前8个字段为一组,后2个字段为一组 var first8Fields = Validation.combine( ReferenceValidator.validateField1(input1), ReferenceValidator.validateField2(input2), ReferenceValidator.validateField3(input3), ReferenceValidator.validateField4(input4), ReferenceValidator.validateField5(input5), ReferenceValidator.validateField6(input6), ReferenceValidator.validateField7(input7), ReferenceValidator.validateField8(input8) ).ap(Tuple8::of); // 合并为Tuple8,错误自动累积为Seq<String> var last2Fields = Validation.combine( ReferenceValidator.validateField9(input9), ReferenceValidator.validateField10(input10) ).ap(Tuple2::of); // 合并为Tuple2,错误自动累积为Seq<String> // 2. 合并两组结果,映射到Reference构造函数 return first8Fields .map(t8 -> (Tuple2<Byte, Character> t2) -> new Reference( t8._1, t8._2, t8._3, t8._4, t8._5, t8._6, t8._7, t8._8, t2._1, t2._2 )) .ap(last2Fields); // ap会自动累积两组的所有错误 } }
关键说明
- 错误累积:
Validation.combine和ap方法会自动收集所有验证错误,最终Failure中包含所有字段的错误信息(Seq<String>)。 - 扩展适配:如果字段数超过16个,可以继续拆分更多组(如8+8+N),重复
ap合并逻辑即可。 - 封装性:将
Reference的构造函数设为私有,仅通过of工厂方法创建实例,确保验证逻辑的唯一性。
内容的提问来源于stack exchange,提问作者Jordi
相关产品推荐
相关产品推荐

