Java 8 为什么不是';t Vavr是否正在将参数识别为map()函数?

Java 8 为什么不是';t Vavr是否正在将参数识别为map()函数?,java-8,functional-programming,either,vavr,Java 8,Functional Programming,Either,Vavr,我正在用神奇的vavr库(0.9.2)弄脏我的手 下面是一段代码片段,旨在收集以下内容之一: payloadPreparationResult= 新的ReportByTeamCriteriaSchemaChecker(“./json/schema/REQ_ReportByTeam_schema.json”) .validateSchema(payLoad)//payLoad是JSON,是此保持函数的参数 .map(JSONPOJOBIDIDirectionalConverter::POJOFYC

我正在用神奇的vavr库(0.9.2)弄脏我的手

下面是一段代码片段,旨在收集以下内容之一:

payloadPreparationResult=
新的ReportByTeamCriteriaSchemaChecker(“./json/schema/REQ_ReportByTeam_schema.json”)
.validateSchema(payLoad)//payLoad是JSON,是此保持函数的参数
.map(JSONPOJOBIDIDirectionalConverter::POJOFYCriterialFieldSteam)
.map((e)->{
CriteriaTeamAllFieldsValidator=new CriteriaTeamAllFieldsValidator(e.right().get());
返回(validator.validate());
})
.map((e)->retrieveRecordsAsPerCriteria(e.right().get())//编译器不批准此行!!
;
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"
                        )
                       )
            );
    }
private
retrieveRecordsAsPerCriteria(CriterialFieldSteam CriterialFieldSteam){
可选retrievedRecords=new MayurModel().retrieveRecords(CriterialFieldSteam);
return((retrievedRecords.isPresent())
?(或者.right(retrievedRecords.get()))
:左(
元组(
ReportByTeamExecutionErrors.NO\u记录\u找到\u匹配\u标准,
未找到与通过的条件匹配的记录
)
)
);
}
编译器正在抱怨:

./com/myApp/application/ReportByTeamResource.java:58:错误: 不兼容类型:无法推断类型变量L、R .map((e)->retrieveRecordsAsPerCriteria(e.right().get()); ^ (实际参数列表和形式参数列表长度不同)其中L、R是类型变量: L扩展方法权限中声明的对象(R) R扩展在方法权限(R)1错误中声明的对象

该列表来自java.util.List

我无法理解问题的根源。这些类型应该很容易推断,至少我认为是这样

IntelliJ似乎对转换没问题,直到这条令人讨厌的线!然而,在该行中,类型参数U是不可解码的。
不知为什么,有人能把我推到我看不见的那条路上去吗

您可能希望使用
flatMap
而不是
map
flatMap
的优点是,您不会得到嵌套的eithers,然后需要以某种方式展开它们(就像您当前在当前代码中使用
.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)
payloadPreparationResult=
新的ReportByTeamCriteriaSchemaChecker(“./json/schema/REQ_ReportByTeam_schema.json”)
.validateSchema(有效载荷)
.flatMap(JSONPOJOBIDIDirectionalConverter::POJOFYCriterialFieldSteam)
.flatMap(e->{
CriteriaTeamAllFieldsValidator验证器=新CriteriaTeamAllFieldsValidator(e);
返回(validator.validate());
})
.flatMap(此::RetrievereCordsAssperCriteria)

看起来像是一些嵌套Eithers的复杂类型。使代码段编译的方法是用
flatMap
替换最后的
map
。但是,替换嵌套的
或者
可能是一个更好的主意,为此,可能需要看一看
flatMap
?好的,从Javadoc:flatMap返回‘如果这是一个左映射结果,则返回右映射结果’,而map返回‘一个映射的Monad’!这可能解释了这一点,因为地图是一种“包装”它再次!我不知道这是否是正确的行为。使用
map
可以将值转换为正确的值(成功)。但是
映射
操作不能根据
左侧
指示故障。这就是
flatMap
的用武之地。如果您想让转换操作指示成功或失败,则应使用flatMap。这将确保您将得到一个平坦的
other
back(而不是嵌套的'other')。因此命名为flatMap.Agreed。我知道我结束了我先前的评论,相当令人困惑。道歉。map()返回一个Monad,但我正在寻找一个确定的投影(左或右)。因此,我可以做的是在映射器中使用模式匹配并返回显式的左或右。当然,在这种情况下,我可能会在治疗“左派”时重复自己的话!flatMap()将我从所有这些中解救出来,因为直到最后,我对其中一个的LeftProjection包含什么都不感兴趣。谢谢你花时间阐述你的观点。
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)