【发布时间】:2019-05-08 04:14:23
【问题描述】:
我正在用神奇的 vavr 库(0.9.2)弄脏我的手。
这是一个代码 sn-p,旨在收集 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 extends Object 声明在方法 right(R) 1 错误
列表来自 java.util.List。
我无法理解问题的根源。类型应该很容易推断出来,或者我认为是这样。
直到这条令人反感的线之前,IntelliJ 似乎都可以接受转换!然而,在那一行中,类型参数 U 是不可破译的。 由于某种原因,有人可以将我推到我看不到的路径吗?
【问题讨论】:
-
看起来很像一些带有嵌套 Eithers 的复杂类型。可以使您的 sn-p 编译的方法是将最终的
map替换为flatMap。但也许替换嵌套的Either是一个更好的主意,可能看看flatMap这个。
标签: java-8 functional-programming either vavr