我想获得一些具有相同内容的Map的新实例,但是Map没有内置的copy
方法。我可以这样做:
val newInst = someMap.map { it.toPair() }.toMap()
但它看起来相当难看。还有更聪明的方法吗?
答案 0 :(得分:45)
只需使用template<typename T> using underlying_type_t = underlying_type<T>::type;
构造函数:
HashMap
Kotlin 1.1的更新:
Since Kotlin 1.1,扩展函数val original = hashMapOf(1 to "x")
val copy = HashMap(original)
和Map.toMap
创建副本。
答案 1 :(得分:5)
使用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
你的方式对我来说也很惯用。
答案 2 :(得分:1)
建议的方法是:
map.toList().toMap()
然而,java的方法速度提高了2到3倍:
(map as LinkedHashMap).clone()
无论如何,如果你觉得没有统一的方法来克隆Kotlin的收藏品(而且还有Java版本!),请在这里投票:https://youtrack.jetbrains.com/issue/KT-11221
答案 3 :(得分:0)
添加此扩展(将条目转换为对)
val <K, V> Map<K, V>.pairs: Array<Pair<K, V>>
get() = entries.map { it.toPair() }.toTypedArray()
然后您可以使用默认的 Kotlin 语法轻松组合不可变映射。
val map1 = mapOf("first" to 1)
val map2 = mapOf("second" to 2)
val map3 = mapOf(
*map1.pairs,
"third" to 3,
*map2.pairs,
)