Kotlin Native中替代Java Map.merge方法的高效简洁实现
替代Kotlin Native中缺失的Map.merge方法的简洁方案
1. 通用扩展函数模拟merge行为
给MutableMap编写扩展函数,完全对齐JVM中Map.merge的逻辑,且仅执行单次键查找:
fun <K, V> MutableMap<K, V>.merge(key: K, value: V, remappingFunction: (V, V) -> V) { val existingValue = this[key] this[key] = existingValue?.let { remappingFunction(it, value) } ?: value }
逻辑说明:
- 仅执行一次键查找获取现有值
- 若键不存在,直接存入新值
- 若键存在,通过传入的合并函数处理现有值与新值后存入
调用方式和你原JVM代码完全一致,无需修改业务逻辑:
@Test fun usingCustomMerge() { val map = mutableMapOf("A" to 42, "B" to 13) map.merge("A", 20, ::max) map.merge("B", 15, ::max) map.merge("C", 10, ::max) val expected = mapOf("A" to 42, "B" to 15, "C" to 10) assertEquals(expected, map) }
2. 针对最大值场景的专用扩展函数
如果你的业务场景仅需要取最大值,可以编写更简洁的专用扩展函数,省去每次传递::max的麻烦:
fun <K, V : Comparable<V>> MutableMap<K, V>.mergeMax(key: K, value: V) { val existingValue = this[key] this[key] = existingValue?.coerceAtLeast(value) ?: value }
调用时更简洁直观:
@Test fun usingMergeMax() { val map = mutableMapOf("A" to 42, "B" to 13) map.mergeMax("A", 20) map.mergeMax("B", 15) map.mergeMax("C", 10) val expected = mapOf("A" to 42, "B" to 15, "C" to 10) assertEquals(expected, map) }
方案优势
- 高效性:每个操作仅执行一次键查找,避免了原代码中读取和赋值时的重复查找
- 简洁性:调用方式和原JVM代码一致,无冗余重复逻辑
- 扩展性:通用扩展函数支持任意合并逻辑,专用函数针对特定场景进一步简化代码
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

