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
    }
}