全不可变层级下向Map子列表添加元素的惯用方法
回答
你的实现思路其实是Kotlin中处理不可变Map与List时非常典型的惯用方式,而且完全抓住了不可变集合操作的核心逻辑——因为原集合都是不可变类型,所以“修改”本质是生成新的集合实例来覆盖原变量。
先拆解下你的原写法:
foo += "1" to (foo["1"] ?: emptyList()) + "c"
这里通过foo["1"] ?: emptyList()安全获取目标列表(键不存在时用空列表兜底),接着用+ "c"生成包含新元素的新列表,最后把新的键值对加入原Map(同样会生成一个新的Map实例),完全符合不可变集合的使用规范,是合理的实现方式。
而你更新后的写法:
foo += "1" to foo["1"].orEmpty() + "c"
则是更简洁的社区惯用写法——orEmpty()是Kotlin标准库为可空集合提供的扩展函数,和?: emptyList()语义完全一致,但代码更紧凑易读,是对原写法的优化,推荐日常使用。
内容的提问来源于stack exchange,提问作者guenhter
相关产品推荐
相关产品推荐

