#java #validation #vavr
#java #проверка #vavr
Вопрос:
У меня есть такой код:
return validators
.stream()
.flatMap(v -> v.validate(scoreRequest).stream())
.collect(toList());
Каждый валидатор возвращает List<String>
количество ошибок, если список пуст, это означает, что запрос действителен.
Теперь я хочу представить vavr.Validator. Новый возвращаемый тип каждого validator.validate теперь Validation<List<String>,ScoreRequest>
Как я могу объединить выходные данные каждого валидатора, используя потоки, как раньше?
Комментарии:
1. Я думаю, вам нужно уточнить свои требования. Как мы могли бы сказать вам, что вы собираетесь делать с этой измененной подписью ?! Вы изменили сигнатуру этого метода, чтобы вернуть объект проверки. Теперь вам нужно определить, как вы хотите разумно это обработать ?!
2. Я просто хочу объединить все проверки, выполняемые каждым валидатором. Результат объединения должен быть:
Validation<List<String>,ScoreRequest>
3. Вы говорите, что каждый метод validate() возвращает объект проверки. Как вы ожидаете их объединить? Как вы переходите из списка ScoreRequest в один ?!
4. Я думал, что Valivation.combine сделал бы именно это. Объедините
List<String>
ошибки или верните scoreRequest, если запрос действителен
Ответ №1:
Вы можете использовать последовательность, чтобы сделать именно это.
Итак, если у вас validators
есть a List<Validation<List<String>, ScoreRequest>>
, применение к нему этой функции вернет a Validation<Seq<String>, Seq<ScoreRequest>>
, который выглядит точно так, как вы хотите. Я позволяю вам разобраться в том, как преобразовать s обратно в любую структуру, которую вы хотите. Seq