我在理解验证库时遇到了一些麻烦,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
。但:
怎么
combine
知道返回Validation<String, ValidRegistrationRequest>
?我觉得这是可能的唯一方法,是 ifcombine
实际上是 aValidation<String, ValidRegistrationRequest>::combine
,所以ap
andmapError
是从这个模板定义的。但我不相信编译器应该能够暗示这combine
指的是返回类型类中的静态实现。这里发生了什么事?[次要] 使用 a
ValidRegistrationRequest
而不是 justRegistrationRequest
again 的用例是什么?我很想在我的编码中做后者,直到我看到一个例子。
我正在阅读的第二个示例在这里: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);
}
}
是从哪里来
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
。)我对这两个例子都有这个问题:如何
combine
知道将哪些参数传递给构造函数(ap
),以及以什么顺序?答案是“所有它的参数,按给定的顺序”吗?
提前致谢。