Kotlin 在迭代两个映射时,我不认为这是一个坏习惯吗';t检查其中一个是否存在密钥?
我有两张地图,我们把它们叫做Kotlin 在迭代两个映射时,我不认为这是一个坏习惯吗';t检查其中一个是否存在密钥?,kotlin,Kotlin,我有两张地图,我们把它们叫做oneMap和twoMap 我正在迭代oneMap中的所有键,如果该键存在于twoMap中,我将执行一些操作 像 视情况而定。你想不想执行“更多的东西” 如果你不想执行它,你应该保持If条件。但是,如果你关心缩进(如果是深层次的层次结构),你可以考虑跳出循环: oneMap中((oneMapKey,oneMapVal)的{ 如果(!twoMap.contains(oneMapKey))继续//继续下一次迭代 //多做事 } 如果映射不包含null值,则还可以获取该值
oneMap
和twoMap
我正在迭代oneMap
中的所有键,如果该键存在于twoMap
中,我将执行一些操作
像
视情况而定。你想不想执行“更多的东西” 如果你不想执行它,你应该保持If条件。但是,如果你关心缩进(如果是深层次的层次结构),你可以考虑跳出循环: oneMap中((oneMapKey,oneMapVal)的
{
如果(!twoMap.contains(oneMapKey))继续//继续下一次迭代
//多做事
}
如果映射不包含null值,则还可以获取该值并检查结果是否为null(这意味着映射中不存在键):
oneMap中((oneMapKey,oneMapVal)的{
val twoMapVal:Any=twoMap[oneMapKey]?:继续//继续下一次迭代
//多做事
}
因此,删除无用的代码和(在我看来)减少if层次结构始终是一种好的做法,因为当你有很多嵌套条件时,你很容易失去焦点。正如Tenfour04所说,省略
containsKey()
检查只是当映射值不可为空时的一个选项;如果是,则[]
/get()
无法区分缺少的映射和到空值的映射
但是如果不是(或者如果你想忽略空值),那么我当然会考虑省略检查;生成的代码会稍微短一些,效率也会稍微高一些,而不会失去清晰性或可维护性。它也可以避免(尽管在多线程的情况下,我会考虑更健壮的保护!)
一种变体是使用let()
和安全调用?。
运算符将其限制为非空情况:
for ((oneMapKey, oneMapVal) in oneMap) {
twoMap[oneMapKey]?.let { twoMapVal ->
if (twoMapVal == oneMapVal) {
// Do more stuff
}
// Do more stuff
}
}
使用
?.let()
这种方式在Kotlin中似乎是一种相当常见的习惯用法,因此它应该是相当透明的。我认为您的第二种方式没有任何问题。如果第一个映射的值类型可为空,则containsKey
检查可能是相关的,而您发布的代码则不是这样。
fun exampleFunc(oneMap: Map<String, Any>, twoMap: Map<String, Any>) {
for((oneMapKey, oneMapVal) in oneMap) {
val twoMapVal = twoMap[oneMapKey]
if (twoMapVal == oneMapVal) {
//do more stuff
}
//do more stuff, I have more if statements
}
}
for ((oneMapKey, oneMapVal) in oneMap) {
twoMap[oneMapKey]?.let { twoMapVal ->
if (twoMapVal == oneMapVal) {
// Do more stuff
}
// Do more stuff
}
}