Kotlin 在科特林复制地图最聪明的方法是什么?

Kotlin 在科特林复制地图最聪明的方法是什么?,kotlin,hashmap,Kotlin,Hashmap,我想获得一些具有相同内容的地图的新实例,但地图没有内置的copy方法。我可以这样做: val newInst = someMap.map { it.toPair() }.toMap() 但它看起来相当难看。还有更聪明的方法吗?使用putAll方法: val map = mapOf("1" to 1, "2" to 2) val copy = hashMapOf<String, Int>() copy.putAll(map) val map=mapOf(“1”到1,“2”到2) v

我想获得一些具有相同内容的地图的新实例,但地图没有内置的
copy
方法。我可以这样做:

val newInst = someMap.map { it.toPair() }.toMap()

但它看起来相当难看。还有更聪明的方法吗?

使用
putAll
方法:

val map = mapOf("1" to 1, "2" to 2)
val copy = hashMapOf<String, Int>()
copy.putAll(map)
val map=mapOf(“1”到1,“2”到2)
val copy=hashMapOf()
复制。putAll(地图)
或:

val map=mapOf(“1”到1,“2”到2)
val copy=map+mapOf()//预设

您的方式在我看来也很惯用。

只需使用
HashMap
构造函数:

val original = hashMapOf(1 to "x")
val copy = HashMap(original)

Kotlin 1.1的更新:


,扩展函数
Map.toMap
Map.toMutableMap
创建副本。

建议的方法是:

map.toList().toMap()
但是,java的方法要快2到3倍:

(map as LinkedHashMap).clone()
无论如何,如果没有统一的方法克隆Kotlin的集合(Java中也有!)让您感到困扰,请在这里投票:

添加此扩展(将条目转换为对)


谢谢你的回答!显然,您想说
val copy=hashMapOf();copy.putAll(map)
因为putAll返回单位。当然,它看起来比我的代码好,但是,它是一个Java方法,需要多行代码,并且不适用于不可变映射。。这真的是最好的方法吗?我已经纠正了这个例子。我认为调用Java方法没有问题,但不变性对您的情况很重要,那么您的方法看起来会更好。调用Java方法本身并不是问题,问题是当原语操作需要一行以上的代码时,该语言被定位为Scala的简单替代语言。你的第二个变种好多了。我认为现在它是不可变的最佳变体,再次感谢大家!不变性现在对我来说并不重要,我只是感兴趣。谢谢!它不适用于不可变的映射,但对于可变的映射仍然很好。如果希望结果为只读类型,请手动声明该类型或使用强制转换:
val copy:Map=HashMap(original)
val copy=HashMap(original)as Map
。如果重复执行此操作,请编写一个扩展函数。@N.Kudriavtsev映射不是不可变的,它们只是从只读接口访问的。因此,如果你最后用一个只读变量来保存上面的例子,那么它是有效的。这是非常低效的,有很多临时对象allocated@voddan我知道,这就是我问这个问题的原因。我认为这是一个错误:
(map as LinkedHashMap).clone()
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,
)