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) }
}
但这给出了一个Type mismatch: inferred type is (Map.Entry<String, Any>, ???) -> Boolean but (Map.Entry<String, Any>) -> Boolean was expected
,我不确定出了什么问题。我试图用它替换它,map1[k] == v
但我仍然得到同样的错误。如何修复编译错误?
解决方案
它无法编译的原因是您忘记了k, v
. 这会产生很大的不同,因为使用括号您正在创建一个需要 1 个参数的 lambda,该参数被分解为 2 个变量 ( k
and 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 }
}
推荐阅读
- python - 用python比较两个回归模型
- objective-c - 使用 PDFDocument initWithData 获取“无法识别的选择器发送到实例”?
- r - 是否可以在 dplyr mutate 中使用自定义函数并选择使用 na.rm = TRUE 或 na.rm = FALSE
- amazon-s3 - 如何创建 IAM 角色,使用户能够创建加密的 s3 存储桶
- macos-catalina - 当我尝试在 macOS Catalina 中运行测试套件时,Xcode 10.3 崩溃了?
- awk - 如何使用 awk 或 grep 在 Bash 中输出超过指定字数的行
- c++ - 如何通知尾部更新到 C++ 窗口中的线程?[读取全局变量的未缓存值]
- sql - 排序数据并移动到sql中的新列
- angular - 需要从 Angular 7 路由器中的路由获取参数
- java - 如何在 Java 中运行动态 mongo 查询