Kotlin中如何实现单次查找的默认Map行为?
Kotlin MutableMap withDefault 不生效与单次查找实现方案
问题原因
withDefault 只是为Map提供了默认值的返回逻辑:当调用getValue找不到对应键时,会返回你指定的默认值,但不会自动将这个默认值存入原Map。所以你执行m.getValue(1).add(2)时,虽然得到了新的MutableList并添加了元素,但这个列表并没有被存入Map,后续查询m[1]仍然是null,这就是你觉得“无法生效”的核心原因。
单次查找的最优实现
Kotlin的MutableMap内置了getOrPut方法,专门解决这类“查找不存在则创建并存入”的场景,且仅会执行一次查找操作,完全符合性能要求:
val m = mutableMapOf<Int, MutableList<Int>>() m.getOrPut(1) { mutableListOf() }.add(2)
逻辑说明
- 当键
1存在时:直接返回对应的MutableList,调用add(2)修改该列表 - 当键
1不存在时:执行Lambda表达式创建空MutableList,将其存入Map中,再返回这个列表,随后执行add(2)
对比两次查找的写法
你之前的两次查找写法需要执行两次Map查询(m[1] == null一次,else分支里的m[1]又是一次),而getOrPut只做一次查找,性能更优,代码也更简洁。
内容的提问来源于stack exchange,提问作者Felix Dombek
相关产品推荐
相关产品推荐

