gpt4 book ai didi

java - io.vavr.control.Validation 在这些示例中如何工作?

转载 作者:行者123 更新时间:2023-12-02 07:52:17 25 4
gpt4 key购买 nike

我在理解验证库时遇到一些困难,io.vavr.control.Validation 。冒着提出过于宽泛的问题的风险,我确实有几个子问题,但我相信它们密切相关,并且可以拼凑起来帮助我理解使用此验证机制的正确方法。

我从这里的例子开始:https://softwaremill.com/javaslang-data-validation .

Validation<String, ValidRegistrationRequest> validate(RegistrationRequest request) {
return combine(
validateCardId(request.getCardId()),
validateTicketType(request.getTicketType()),
validateGuestId(request.getGuestId())
)
.ap(ValidRegistrationRequest::new)
.mapError(this::errorsAsJson);
}

private Validation<String, Card> validateCardId(String cardId) {
// validate cardId
// if correct then return an instance of entity the cardId corresponds to
}

private Validation<String, TicketType> validateTicketType(String ticketType) {
// validate ticketType
// if known then return enumeration representing the ticket
}

private Validation<String, Guest> validateGuest(String guestId) {
// validate guestId
// if correct then return an instance of entity the questId corresponds to
}

一开始我不明白Validation<String, ValidRegistrationRequest>的通用参数在哪里来自。我现在明白它们与传递给 mapError 的方法的返回类型相关联。和ap , 分别。但是:

  1. combine 怎么样?知道返回Validation<String, ValidRegistrationRequest> ?我觉得唯一可能的方法是 combine实际上是一个Validation<String, ValidRegistrationRequest>::combine ,这样 apmapError是从此模板定义的。但我不认为编译器应该能够暗示 combine指返回类型的类中的静态实现。这里发生了什么?

  2. [次要] 使用 ValidRegistrationRequest 的用例是什么?而不仅仅是 RegistrationRequest再次?我很想在编码中执行后者,直到我看到一个示例。

我读到的第二个例子在这里:http://www.vavr.io/vavr-docs/#_validation .

class PersonValidator {

private static final String VALID_NAME_CHARS = "[a-zA-Z ]";
private static final int MIN_AGE = 0;

public Validation<Seq<String>, Person> validatePerson(String name, int age) {
return Validation.combine(validateName(name), validateAge(age)).ap(Person::new);
}

private Validation<String, String> validateName(String name) {
return CharSeq.of(name).replaceAll(VALID_NAME_CHARS, "").transform(seq -> seq.isEmpty()
? Validation.valid(name)
: Validation.invalid("Name contains invalid characters: '"
+ seq.distinct().sorted() + "'"));
}

private Validation<String, Integer> validateAge(int age) {
return age < MIN_AGE
? Validation.invalid("Age must be at least " + MIN_AGE)
: Validation.valid(age);
}

}
  1. Seq 去哪儿了?来自?没有 mapError 时是默认的吗是否供应?但我正在查看 Validation.class 的反编译 .class 文件,以及对 Seq引用在这里:

      static <E, T> Validation<List<E>, Seq<T>> sequence(Iterable<? extends Validation<List<E>, T>> values) {
    Objects.requireNonNull(values, "values is null");
    List<E> errors = List.empty();
    List<T> list = List.empty();
    Iterator var3 = values.iterator();

    while(var3.hasNext()) {
    Validation<List<E>, T> value = (Validation)var3.next();
    if (value.isInvalid()) {
    errors = errors.prependAll(((List)value.getError()).reverse());
    } else if (errors.isEmpty()) {
    list = list.prepend(value.get());
    }
    }

    return errors.isEmpty() ? valid(list.reverse()) : invalid(errors.reverse());
    }

    我认为这不相关。也许我正在使用过时的 Validation ? (毕竟在我的导入中是 javaslang.control.Validation ,而不是 io.vavr.control.Validation 。)

  2. 我对这两个例子都有这个问题:combine 是如何做到的?知道要传递给构造函数 ( ap ) 的参数以及按什么顺序?答案是“所有参数,按照给定的顺序”吗?

提前致谢。

最佳答案

您和我第一次寻找 Vavr 验证机制时有同样的问题和疑虑。

以下是我对前两个问题的回答:

  1. combine(...)方法返回一个验证构建器的实例,在本例中,这是一个 Builder3类(class)持有三项成绩validate*(...)功能。 ap(...) method 是此构建器的一个方法,并触发 Validation 的构建实例。

调用时,验证结果将逐一应用于作为参数提供的函数的柯里化(Currying)版本:

v3.ap(v2.ap(v1.ap(Validation.valid(f.curried()))))

在示例中,fValidRegistrationRequest 的构造函数类(class)。最后,我们进行了保存有效请求实例的验证。

另一方面,如果任何结果无效,该方法将创建一个包含错误消息列表的无效结果。并调用mapError(this::errorsAsJson) (这次在 Validation 实例上!)将其转换为 JSON 格式。

  • 使用 ValidRegistrationRequest 的用例是什么? ?
  • 我在我的一个项目中使用了 Vavr 的验证。我收到一个带有一些实体标识符的请求。为了验证它的正确性,我必须查询数据库来检查每个 id 是否有对应的内容。

    因此,如果验证随原始请求一起返回,我将不得不再次从数据库中获取这些对象。于是,我决定回ValidRegistrationRequest持有领域对象。由于仅调用数据库一次,请求处理速度明显加快。

    第二对问题的答案:

    1. 是的,你说得对。如果结果无效,Validation.combine(...).ap(...)返回一个实例 Invalid类,保存从验证方法返回的错误消息列表。

    如果您查看来源,请访问 Validation.ap(...)方法,您可以看到无效结果被收集到 Vavr 的 List 中。因为它继承自Seq ,你可以在 validatePerson 中看到这个类型示例Seq<String> .

  • 是的,完全正确。 “它的所有参数,按照给定的顺序”:)
  • combine 中的参数顺序必须与提供给 ap(...) 的函数所采用的参数顺序相同方法。

    下载源代码后,可以更轻松地跟踪 Vavr 的内部结构。

    关于java - io.vavr.control.Validation 在这些示例中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452772/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com