首页 > 解决方案 > Kotlin - 检查一张地图是否包含另一张地图的所有条目

问题描述

我正在尝试在 kotlin 中创建一个函数,它需要两个映射,如果一个包含在另一个映射中,则返回 true,也就是说,如果映射 A 中的所有条目都在映射 B 中(但 B 可以有其他条目)

我的代码是

private fun matchesMap(map1: Map<String, Any>, reference: Map<String, Any>): Boolean {
    return reference.all { k, v ->  map1.get(k).equals(v) }
}

但这给出了一个Type mismatch: inferred type is (Map.Entry<String, Any>, ???) -> Boolean but (Map.Entry<String, Any>) -> Boolean was expected,我不确定出了什么问题。我试图用它替换它,map1[k] == v但我仍然得到同样的错误。如何修复编译错误?

标签: genericskotlin

解决方案


它无法编译的原因是您忘记了k, v. 这会产生很大的不同,因为使用括号您正在创建一个需要 1 个参数的 lambda,该参数被分解为 2 个变量 ( kand v),而没有括号则您提供的 lambda 需要 2 个不同的参数。all正如@Gennady 正确指出的那样,后者与 的签名不兼容。

另外,另一个问题是由该.equals方法引起的,因为get它返回一个可为空的值(如果映射中没有这样的键怎么办?),所以应该调用equals方法为?.equals,可以简化为==. 另外,get也可以简化为[]

放在一起:

private fun matchesMap(map1: Map<String, Any>, reference: Map<String, Any>): Boolean {
    return reference.all { (k, v) ->  map1[k] == v }
}

推荐阅读