[英]Is it considered bad convention when in iterating through two maps, I don't check if key exists in one of them?
我有兩張地圖,我們稱它們為oneMap
和twoMap
。
我正在遍歷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.