What is the smartest way to copy a Map in Kotlin?

KotlinHashmap

Kotlin Problem Overview


I'd like to get a new instance of some Map with the same content but Map doesn't have a built-in copy method. I can do something like this:

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

But it looks rather ugly. Is there any more smarter way to do this?

Kotlin Solutions


Solution 1 - Kotlin

Just use the HashMap constructor:

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

Update for Kotlin 1.1:

Since Kotlin 1.1, the extension functions Map.toMap and Map.toMutableMap create copies.

Solution 2 - Kotlin

Use putAll method:

val map = mapOf("1" to 1, "2" to 2)
val copy = hashMapOf<String, Int>()
copy.putAll(map)

Or:

val map = mapOf("1" to 1, "2" to 2)
val copy = map + mapOf<String, Int>() // preset

Your way also looks idiomatic to me.

Solution 3 - Kotlin

The proposed way of doing this is:

map.toList().toMap()

However, the java's method is 2 to 3 times faster:

(map as LinkedHashMap).clone()

Anyway, if it bothers you that there is no unified way of cloning Kotlin's collections (and there is in Java!), vote here: https://youtrack.jetbrains.com/issue/KT-11221

Solution 4 - Kotlin

Add this extension (to convert entries to pairs)

val <K, V> Map<K, V>.pairs: Array<Pair<K, V>>
    get() = entries.map { it.toPair() }.toTypedArray()

And then you can easy combine immutable maps using default Kotlin syntax.

val map1 = mapOf("first" to 1)
val map2 = mapOf("second" to 2)
val map3 = mapOf(
    *map1.pairs,
    "third" to 3,
    *map2.pairs,
)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionN. KudryavtsevView Question on Stackoverflow
Solution 1 - KotlinIngo KegelView Answer on Stackoverflow
Solution 2 - KotlinmarcospereiraView Answer on Stackoverflow
Solution 3 - KotlinvoddanView Answer on Stackoverflow
Solution 4 - KotlinPavel ShorokhovView Answer on Stackoverflow