Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 在完全不可变的层次结构中将元素添加到子列表中的惯用方法_Kotlin - Fatal编程技术网

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")

}