Kotlin 在完全不可变的层次结构中将元素添加到子列表中的惯用方法
我有以下数据结构:Kotlin 在完全不可变的层次结构中将元素添加到子列表中的惯用方法,kotlin,Kotlin,我有以下数据结构: var foo: Map<String, List<String>> = emptyMap() foo += mapOf( "1" to listOf("a", "b"), "2" to listOf("a", "b"), "3" to listOf("a", "b") ) 但这真的是惯用的方式吗 基于@hotkeys answer更新 foo += "1" to foo["1"].orEmpty()
var foo: Map<String, List<String>> = emptyMap()
foo += mapOf(
"1" to listOf("a", "b"),
"2" to listOf("a", "b"),
"3" to listOf("a", "b")
)
但这真的是惯用的方式吗
基于@hotkeys answer更新
foo += "1" to foo["1"].orEmpty() + "c"
您可以检查的另一种方法是使用的方法(或仅使用该库)。它允许您创建一个映射,该映射使用应用的突变创建该映射的不可变副本:
val m = immutableHashMapOf("1" to listOf("a", "b"))
val result = m.mutate { it["1"] = it["1"].orEmpty() + "c" }
另见:
虽然标准库中没有与
.mutate{…}
等效的函数,但是您可以为只读映射定义自己的扩展,这也可以做到。除非出现问题,否则可以连接声明和赋值。
使映射和列表可变,因为需要进行变异
var foo: MutableMap<String, MutableList<String>> = mutableMapOf(
"1" to mutableListOf("a", "b"),
"2" to mutableListOf("a", "b"),
"3" to mutableListOf("a", "b")
)
这就是重点:我希望数据结构是不可变的。对于可变集合,这一点都没有问题。与foo+=“1”到foo[“1”]相比,您的解决方案的主要优势是什么。orEmpty()+“c”
@guenhter.mutate{…}
方法适用于所有类型的突变,包括多个后续突变。如果您经常需要同时进行多个突变,那么这可能会更有效。
var foo: MutableMap<String, MutableList<String>> = mutableMapOf(
"1" to mutableListOf("a", "b"),
"2" to mutableListOf("a", "b"),
"3" to mutableListOf("a", "b")
)
when {
foo.containsKey("1") -> foo["1"]?.add("c")
else -> foo["1"] = mutableListOf("c")
}