поток проверки валидаторов vavr

#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