如何让 ComputeIfPresent 在 Map 中使用 Map?

2022-09-03 06:28:08

当尝试使用 computeIfPresent() 方法更改 Map 时,我在使用 innerMap 时无法实现此方法。

这有效:

Map<String, Integer> mapOne = new HashMap<>();
mapOne.computeIfPresent(key, (k, v) -> v + 1);

这不起作用:

Map<String, Map<String, Integer>> mapTwo = new HashMap<>();
mapTwo.computeIfPresent(key, (k, v) -> v.computeIfPresent(anotherKey, (x, y) -> y + 1);

在第二个示例中,我收到以下错误消息:“lambda 表达式中的返回类型错误:整数无法转换为”。我的 IDE 将 v 识别为映射。但该函数不起作用。Map<String, Integer>

显然,该方法返回一个整数,但我看不出这与没有Innermap的第一个方法有何不同。到目前为止,我还没有在网上找到类似的案例。

我怎样才能让它工作?


答案 1

外部 lambda 表达式应返回由 以下项引用的:Mapv

mapTwo.computeIfPresent(key, 
                        (k, v) -> {
                                v.computeIfPresent(anotherKey, (x, y) -> y + 1); 
                                return v;
                            });

它不能返回表达式 的值。Integerv.computeIfPresent(anotherKey, (x, y) -> y + 1);


答案 2

为了了解您的问题,让我们看一下您正在使用的方法的签名:

V computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)

如您所见,它返回一个基于泛型参数的类型,该参数代表存储在 中的值。这是您面临问题的地方: 您的内部地图存储 ,因此当您调用时,您会得到,而您的外部地图则需要另一个 。VMapIntegercomputeIfPresentIntegerMap

编辑:
在编写时,我意识到Eran已经给出了一个代码示例,展示了如何做到这一点。
但是我会留下这个答案,因为它解释了为什么你的方法不起作用,所以它可能会帮助某人。