簡體   English   中英

在 Kotlin 中:從兩個映射中對一個公共鍵的兩個值求和的優雅方法是什么?

[英]In Kotlin: What is an elegant way to sum two values of a common key from two maps?

我有一個現有的地圖,其中包含簡單的整數值。 我想通過包含可能鍵之一的給定地圖的值更新現有地圖。

val originMap = mutableMapOf("Foo" to 10, "Bar" to 5)
val additionalMap = mapOf("Foo" to 4)

// questioned logic

assertThat(originMap).containsEntry("Foo", 14)

你可以這樣做:

val mergedMap = (originMap.toList() + additionalMap.toList())
        .groupBy({ it.first }, { it.second })
        .map { (key, values) -> key to values.sum() }
        .toMap()

println(mergedMap) // [(Foo, 14), (Bar, 5)]

在這里試試吧!

如果你想使用originMap就地而不是宣布一個新的Map ,你可以合並addtionalMap通過的副作用為它forEach

additionalMap.forEach { (k, v) -> originMap.merge(k, v, Int::plus) }
// Prints {Foo=14, Bar=5}

這將從additionalMap獲取每個鍵 ( k ) 和值 ( v ),並使用Int::plus將其添加到originMap的值。

與之前的答案類似,但沒有 JVM 特定的 API:

additionalMap.forEach { (k, v) -> originMap[k] = (originMap[k] ?: 0) + v }

上述方案有一個小錯誤,這將增加所有附加鍵在additionalMap其中不存在於originalMap的結果。 下面的含義將產生這樣的輸出:

val originMap = mutableMapOf("Foo" to 10, "Bar" to 5)
val additionalMap = mapOf("Foo" to 4, "Baz" to 3)
additionalMap.forEach { (k, v) -> if (originMap.containsKey(k)) originMap.merge(k, v, Int::plus) }
// Prints {Foo=14, Bar=5, Baz=3}

因此,沒有小錯誤的相同解決方案如下所示:

additionalMap.forEach { (k, v) -> if (originMap.containsKey(k)) originMap.merge(k, v, Int::plus) }
// Prints {Foo=14, Bar=5}

如果擔心 JVM 特定的 API:那么就像

additionalMap.forEach { (k, v) -> if (originMap[k] != null) originMap[k] = (originMap[k] ?: 0) + v }
// Prints {Foo=14, Bar=5}

暫無
暫無

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

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