Каков самый умный способ скопировать карту в Котлин?

Я хотел бы получить новый экземпляр некоторой Карты с тем же контентом, но Map не имеет встроенного метода copy. Я могу сделать что-то вроде этого:

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

Но это выглядит довольно уродливо. Есть ли более умный способ сделать это?

Ответ 1

Просто используйте конструктор HashMap:

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

Обновление для Kotlin 1.1:

Начиная с Kotlin 1.1, функции расширения Map.toMap и Map.toMutableMap создают копии.

Ответ 2

Используйте метод 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

Твой путь тоже выглядит идиоматичным для меня.

Ответ 3

Предлагаемый способ:

map.toList().toMap()

Однако метод java в 2 - 3 раза быстрее:

(map as LinkedHashMap).clone()

В любом случае, если вас беспокоит, что нет единого способа клонирования коллекций Котлина (и есть на Java!), Проголосуйте здесь: https://youtrack.jetbrains.com/issue/KT-11221