我希望获得一个新的Map实例,其内容与原始实例相同,但是Map没有内置的copy
方法。 我可以像这样做:
val newInst = someMap.map { it.toPair() }.toMap()
但是它看起来相当丑陋。有没有更聪明的方法来做到这一点?
我希望获得一个新的Map实例,其内容与原始实例相同,但是Map没有内置的copy
方法。 我可以像这样做:
val newInst = someMap.map { it.toPair() }.toMap()
但是它看起来相当丑陋。有没有更聪明的方法来做到这一点?
只需使用 HashMap
构造函数:
val original = hashMapOf(1 to "x")
val copy = HashMap(original)
Kotlin 1.1更新:
自Kotlin 1.1起,扩展函数Map.toMap
和Map.toMutableMap
将创建副本。
val copy : Map<Int,String> = HashMap(original)
或 val copy = HashMap(original) as Map<Int, String>
。如果您需要经常这样做,请编写一个扩展函数。 - Kirill Rakhman使用 putAll
方法:
val map = mapOf("1" to 1, "2" to 2)
val copy = hashMapOf<String, Int>()
copy.putAll(map)
或者:
val map = mapOf("1" to 1, "2" to 2)
val copy = map + mapOf<String, Int>() // preset
val copy = hashMapOf<String, Int>(); copy.putAll(map)
,因为 putAll 返回 Unit。当然,这比我的代码看起来更好,但它是一个 Java 方法,需要多于一行,并且不能用于不可变映射.. 这真的是最好的方法吗? - N. Kudryavtsev+
而点赞。 - AlikElzin-kilakamap.toList().toMap()
(map as LinkedHashMap).clone()
无论如何,如果你觉得 Kotlin 的集合没有统一的克隆方式有点麻烦(Java 中是有的!),请在这里投票:https://youtrack.jetbrains.com/issue/KT-11221
val <K, V> Map<K, V>.pairs: Array<Pair<K, V>>
get() = entries.map { it.toPair() }.toTypedArray()
val map1 = mapOf("first" to 1)
val map2 = mapOf("second" to 2)
val map3 = mapOf(
*map1.pairs,
"third" to 3,
*map2.pairs,
)