从不可变映射和附加键值创建新映射的 Kotlin 标准方法

diz*_*iaq 3 dictionary immutability data-structures kotlin

Kotlin 中是否有标准方法将新的键值对与不可变映射关联起来?

associate(mapOf("A" to 1, "B" to 2), "C", 3); // => {A=1, B=2, C=3}
Run Code Online (Sandbox Code Playgroud)

考虑类似于Clojure 中的accos函数的东西。

(assoc {:key1 "value1" :key2 "value2"} :key3 "value3")   
                                    ;;=> { :key1 "value1", :key2 "value2", :key3 "value3"}
Run Code Online (Sandbox Code Playgroud)

如何使其直接将条目复制到新映射中是显而易见的,但我相信 Kotlin 标准库中实现了更优化的方法。你能举一个惯用的例子吗?

Ten*_*r04 11

这是使用加号运算符完成的。

\n
val map1 = mapOf("A" to 1, "B" to 2)\nval map2 = map1 + ("C" to 3)\n\n// or for a read-write variable/property:\nvar map = mapOf("A" to 1, "B" to 2)\nmap += "C" to 3\n
Run Code Online (Sandbox Code Playgroud)\n

如果要一次添加多个项目,可以在加号后面放置任何集合或成对数组:

\n
val map1 = mapOf("A" to 1, "B" to 2)\nval map2 = map1 + arrayOf("C" to 3, "D" to 4)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,映射的正确术语是 \xe2\x80\x9cread-only\xe2\x80\x9d 映射,而不是 \xe2\x80\x9cimmutable\xe2\x80\x9d 映射。Map 通常是一个 MutableMap,已被转换为只读 Map,因此它实际上并不是不可变的。Kotlin 中有一个常见的模式,即类通过一个属性公开对可变集合的访问,该属性将其升级为只读实现,但继续改变外部类的引用以观察更改。

\n

  • 特别感谢您对 Kotlin 的“只读”方法的评论。 (3认同)