我想獲得一個具有相同內容的某個Map的新實例,但Map沒有內置的copy
方法。我可以這樣做:在Kotlin中複製地圖的最明智的方法是什麼?
val newInst = someMap.map { it.toPair() }.toMap()
但它看起來相當醜陋。有沒有更聰明的方法來做到這一點?
我想獲得一個具有相同內容的某個Map的新實例,但Map沒有內置的copy
方法。我可以這樣做:在Kotlin中複製地圖的最明智的方法是什麼?
val newInst = someMap.map { it.toPair() }.toMap()
但它看起來相當醜陋。有沒有更聰明的方法來做到這一點?
只需使用HashMap
構造:
val original = hashMapOf(1 to "x")
val copy = HashMap(original)
更新科特林1.1:
Since Kotlin 1.1,擴展功能Map.toMap
和Map.toMutableMap
創建副本。
謝謝!它不適用於不可變的地圖,但仍然適用於可變的地圖。 –
如果您希望結果是隻讀類型,請手動聲明類型或使用強制轉換:'val copy:Map
@ N.Kudriavtsev地圖不是不可變的,它們只是從只讀接口訪問。所以上面的例子確實有效,如果你最終只使用readonly變量。 –
使用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
你的方式看起來也習慣了我。
謝謝你的回答!顯然,你想說'val copy = hashMapOf
我糾正了這個例子。我沒有看到調用Java方法的問題,但不變性對於您的情況很重要,那麼您的方法看起來更好。 – marcospereira
調用Java方法本身並不是一個問題,問題在於當原語操作需要多於一行代碼的語言被定位爲Scala的簡單替代品時。你的第二個變體要好得多。我認爲現在它是不可變的最佳變體,所以再次感謝你!不變對我來說並不重要,我只是感興趣。 –
這樣做的提出方式是:
map.toList().toMap()
但是,Java的方法是快2〜3倍:
(map as LinkedHashMap).clone()
無論如何,如果你煩惱,有沒有統一的方式克隆Kotlin的收藏(在Java中有!),投票在這裏:https://youtrack.jetbrains.com/issue/KT-11221
這是非常低效的,大量的臨時對象分配 – voddan
@voddan我知道,這是w我問過這個問題。 –
我認爲這是一個錯誤:https://youtrack.jetbrains.com/issue/KT-11221 – voddan