You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:17:09