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

时间:2016-02-27 16:12:27

标签: kotlin

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

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

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

4 个答案:

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