You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:05:38