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