java Mono平面图采集时丢失返回类型信息

ghhkc1vu  于 2023-02-14  发布在  Java
关注(0)|答案(2)|浏览(137)

我用Reactor写了如下代码

private Mono<Map<String, A>> resolve(Mono<Map<String, List<B>>> bMapMono) {
        return bMapMono.flatMap(bMap -> bMap.entrySet().stream()
                                                     .map(entry -> toAfunc(entry.getKey(), entry.getValue()))
                                                     .filter(Objects::nonNull)
                                                     .collect(Collectors.<A, String, A>toMap(x -> x.getStringKey(), Function.identity())));
    }

但在编译器智能中显示错误
像这样

Required type: Mono <Map<String, A>> 
Provided: Mono <Object>

我该如何解决这个问题?

kkbh8khc

kkbh8khc1#

我可以在IntelliJ中重现这个错误。看起来好像Mono::flatMap中的lambda返回了一个Map,而你想要返回的是一个Mono。虽然你可以通过将lambda结果 Package 在一个mono中来解决这个问题,但你可能需要考虑使用reactor方法,它支持你可能试图用流实现的目标。考虑以下内容:

return bMapMono.flatMapIterable(Map::entrySet)
                .mapNotNull(entry -> toAfunc(entry.getKey(), entry.getValue()))
                .collect(Collectors.toMap(A::getStringKey, Function.identity()));
xwbd5t1u

xwbd5t1u2#

编译器似乎无法推断Collectors.toMap操作结果的正确类型。要解决此问题,可以显式指定返回Map的类型

private Mono<Map<String, A>> resolve(Mono<Map<String, List<B>>> bMapMono) {
    return bMapMono.flatMap(bMap -> bMap.entrySet().stream()
                                                 .map(entry -> toAfunc(entry.getKey(), entry.getValue()))
                                                 .filter(Objects::nonNull)
                                                 .collect(Collectors.toMap(x -> x.getStringKey(), Function.identity(), (a, b) -> a, HashMap::new)));
}

在此代码中,HashMap::new用于创建HashMap的新示例,该示例用作Collectors.toMap操作的结果。
这应该可以解决这个问题,并允许编译器正确地推断返回的Mono的类型。

相关问题