为什么Vavr Ether不能识别map()函数的参数?

时间:2018-12-06 12:49:10

标签: java-8 functional-programming either vavr

我正在用神奇的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错误中声明的对象

该列表来自java.util.List。

我不知所措,以了解问题的根源。类型应该很容易推断,或者我想。

enter image description here

IntelliJ似乎可以进行转换,直到这令人反感的行为止!但是,在那一行中,类型参数U是不可识别的。 出于某些原因,有人可以将我推到我看不见的道路吗?

1 个答案:

答案 0 :(得分:1)

可能您可能想使用flatMap而不是mapflatMap的优点是您不会以某种方式得到 unwrap 所需的嵌套嵌套(例如您当前在当前代码中使用.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)