Почему Vavr Either не распознает параметр функции map()?
Я пачкаю руки фантастической библиотекой vavr (0.9.2).
Вот фрагмент кода, который призван собрать либо:
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.
Я в конце своего ума, чтобы понять источник проблемы. Типы должны быть легко выведены, или я так думаю.
IntelliJ, кажется, в порядке с преобразованиями до этой нежелательной строки! Однако в этой строке параметр типа U не может быть расшифрован. Может ли кто-нибудь, по какой-то причине, подтолкнуть меня к пути, который я не вижу?
1 ответ
Возможно, вы захотите использовать 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)