簡體   English   中英

在遍歷兩個映射時是否被認為是不好的約定,我不檢查其中一個映射中是否存在鍵?

[英]Is it considered bad convention when in iterating through two maps, I don't check if key exists in one of them?

我有兩張地圖,我們稱它們為oneMaptwoMap

我正在遍歷oneMap中的所有鍵,如果鍵存在於twoMap我會執行類似的操作


fun exampleFunc(oneMap: Map<String, Any>, twoMap: Map<String, Any>) {
   for((oneMapKey, oneMapVal) in oneMap) {
      if (twoMap.containsKey(oneMapKey)) {
         val twoMapVal = twoMap[oneMapKey]
         if (twoMapVal == oneMapVal) {
            //do more stuff
         }  
         //do more stuff, I have more if statements
      }      
   }
}

為了避免有更多的嵌套 if 語句,我想知道是否可以擺脫

if (twoMap.containsKey(oneMapKey))檢查。 如果twoMap不包含oneMapKey ,我們會得到一個 null object,我的代碼仍然可以正常工作。 我想知道這是否被認為是不好的約定


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

這取決於。 你想執行“更多的東西”嗎?

如果您不想執行它,則應保留 if 條件。 但是,如果您擔心縮進(如果層次結構很深),您可以考慮跳出循環:

for((oneMapKey, oneMapVal) in oneMap) {
  if (!twoMap.contains(oneMapKey)) continue // continue with next iteration

  // do more stuff
}

如果您的 map 不包含 null 值,您還可以獲取該值並檢查結果是否為 null (這意味着地圖中不存在密鑰):

for((oneMapKey, oneMapVal) in oneMap) {
  val twoMapVal: Any = twoMap[oneMapKey] ?: continue // continue with next iteration

  // do more stuff
}

因此,刪除無用的代碼和(在我看來)減少 if 層次結構總是很好的做法,因為當您有很多嵌套條件時,您可以輕松地放松焦點。

正如 Tenfour04 所說,如果 map 值不可為空,則省略containsKey()檢查只是一種選擇; 如果是,則[] / get()無法區分缺少的映射和到 null 值的映射。

但如果不是(或者如果你想忽略 null 值),那么我當然會考慮省略檢查; 生成的代碼會稍短一些,效率稍高一些,而不會失去清晰度或可維護性。 它還可以避免潛在的競爭條件 (雖然在多線程情況下,我會考慮更強大的保護!)

一種變體是將let()與安全調用?. 運算符將其限制為非空情況:

for ((oneMapKey, oneMapVal) in oneMap) {
    twoMap[oneMapKey]?.let { twoMapVal ->
        if (twoMapVal == oneMapVal) {
            // Do more stuff
        }
        // Do more stuff
    }
}

以這種方式使用?.let()似乎是 Kotlin 中相當常見的習慣用法,因此它應該是相當透明的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM