Kotlin中如何在键不存在时更新只读Map?现有实现是否更优?
Map的addIfAbsent扩展函数优化实现
你的初始实现逻辑是没问题的,针对不可变Map完成了“不存在则添加”的核心需求。这里提供几种更贴合Kotlin风格的简化优化方案:
方案一:用Kotlin原生语法简化判断
fun <K, V> Map<K, V>.addIfAbsent(key: K, f: (K) -> V): Map<K, V> = if (key in this) this else this + (key to f(key))
用key in this替代containsKey(key),更符合Kotlin的惯用写法;同时f.invoke(key)可直接简化为f(key),减少冗余调用代码。
方案二:用takeIf压缩分支逻辑
fun <K, V> Map<K, V>.addIfAbsent(key: K, f: (K) -> V): Map<K, V> = takeIf { it.containsKey(key) } ?: this + (key to f(key))
通过takeIf直接判断key是否存在,存在则返回原Map,否则返回添加新键值对后的新Map,代码更简洁紧凑。
补充说明
如果你的场景是使用MutableMap,Kotlin标准库已经内置了computeIfAbsent方法,直接调用即可:
mutableMap.computeIfAbsent(key) { f(it) }
但你的扩展函数针对的是不可变Map,上述优化方案更适配你的需求——在保持不可变特性的前提下,通过返回新Map实现添加逻辑。
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

