Почему Vavr Either не распознает параметр функции map ()? - PullRequest
0 голосов
/ 06 декабря 2018

Я пачкаю руки фантастической библиотекой vavr (0.9.2).

Вот фрагмент кода, цель которого собрать Either :

    Either<Tuple2<Enum<ReportByTeamExecutionErrors>,String>, List<MayurDAO>> payloadPreparationResult =
    new ReportByTeamCriteriaSchemaChecker("./json/schema/REQ_ReportByTeam_Schema.json")
    .validateSchema(payLoad) // payload is JSON and is a paramter to this holding function
.map(JsonPOJOBidirectionalConverter::pojofyCriteriaAllFieldsTeam)
.map((e) -> {
        CriteriaTeamAllFieldsValidator validator =  new CriteriaTeamAllFieldsValidator(e.right().get());
        return(validator.validate());
 })
 .map((e) -> retrieveRecordsAsPerCriteria(e.right().get())) // compiler doesn't approve of this line!!
 ;

Метод retrieveRecordsAsPerCriteria определяется следующим образом:

private Either<Tuple2<Enum<ReportByTeamExecutionErrors>,String>, List<MayurDAO>>
    retrieveRecordsAsPerCriteria(CriteriaAllFieldsTeam criteriaAllFieldsTeam) {

        Optional<List<MayurDAO>> retrievedRecords = new MayurModel().retrieveRecords(criteriaAllFieldsTeam);

        return( (retrievedRecords.isPresent())
                ? (Either.right(retrievedRecords.get()))
                : Either.left(
                        Tuple.of(
                             ReportByTeamExecutionErrors.NO_RECORDS_FOUND_TO_MATCH_CRITERIA,
                             "No records have been found, which match the criteria passed"
                        )
                       )
            );
    }

Компилятор жалуется:

. / Com / myApp / application / ReportByTeamResource.Java: 58: ошибка: несовместимые типы: невозможно определить переменные типа (ов) L, R .map ((e) -> retrieveRecordsAsPerCriteria (e.right (). get ()));^ (фактические и формальные списки аргументов различаются по длине), где L, R - переменные типа: L расширяет Объект, объявленный в методе right (R) R расширяет Объект, объявленный в методе right (R) 1 error

Список составлен из java.util.List.

Я нахожусь в конце, чтобы понять источник проблемы.Типы должны быть легко выведены, или я так думаю.

enter image description here

Кажется, что IntelliJ в порядке с преобразованиями до этой нежелательной строки!Однако в этой строке параметр типа U не может быть расшифрован.Может ли кто-нибудь, по какой-то причине, подтолкнуть меня к пути, который я не вижу?

1 Ответ

0 голосов
/ 06 декабря 2018

Возможно, вы захотите использовать flatMap вместо map.Преимущество flatMap заключается в том, что вы не получаете вложенные файлы, которые вам затем нужно каким-то образом развернуть (как вы сейчас делаете с .right().get() в вашем текущем коде).

Итак, код будет выглядеть примерно так:

Either<Tuple2<Enum<ReportByTeamExecutionErrors>,String>, List<MayurDAO>> payloadPreparationResult =
new ReportByTeamCriteriaSchemaChecker("./json/schema/REQ_ReportByTeam_Schema.json")
    .validateSchema(payLoad)
    .flatMap(JsonPOJOBidirectionalConverter::pojofyCriteriaAllFieldsTeam)
    .flatMap(e -> {
        CriteriaTeamAllFieldsValidator validator =  new CriteriaTeamAllFieldsValidator(e);
        return (validator.validate());
    })
    .flatMap(this::retrieveRecordsAsPerCriteria)
...