Generics Kotlin-检查一个映射是否包含来自另一个映射的所有条目

Generics Kotlin-检查一个映射是否包含来自另一个映射的所有条目,generics,kotlin,Generics,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)

我试图在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) }
}

但这会导致类型不匹配:推断的类型是Map.Entry,????->布尔值,但Map.Entry->Boolean是预期值,我不确定出了什么问题。我试图用map1[k]==v替换它,但仍然得到相同的错误。如何修复编译错误?

根据规范方法-lambda的参数为Entry。您无法直接获取键和值,因此将其更改为Entry

正确代码:

reference.all { entry ->  map1.get(entry.key) == entry.value }

您应该使用映射方法。它也一样。

它不能编译的原因是您忘记了k,v周围的一对括号。这是一个很大的区别,因为使用括号创建的lambda需要1个参数,分为2个变量k和v,而没有括号,您提供的lambda需要2个不同的参数。后者与所有人的签名不兼容,正如@Gennady正确指出的那样

另外,另一个问题是由.equals方法引起的,因为get返回一个可为null的值,如果map?中没有这样的键,那么equals方法应该作为?.equals调用,可以简化为==。此外,get也可以简化为[]

综合起来:

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

Map.equals不相同,因为它还检查它们是否大小相同。OP希望允许其他地图包含第一个地图中没有的其他条目。是的,谢谢,你说得对。方法containsAll将是正确的答案已经有一个函数用于此,但是您需要在条目上使用它,而不是映射本身。mapB.entries.containsAllmapA.entries。