2016-02-27 62 views
20

我想獲得一個具有相同內容的某個Map的新實例,但Map沒有內置的copy方法。我可以這樣做:在Kotlin中複製地圖的最明智的方法是什麼?

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

但它看起來相當醜陋。有沒有更聰明的方法來做到這一點?

+0

這是非常低效的,大量的臨時對象分配 – voddan

+0

@voddan我知道,這是w我問過這個問題。 –

+0

我認爲這是一個錯誤:https://youtrack.jetbrains.com/issue/KT-11221 – voddan

回答

31

只需使用HashMap構造:

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

更新科特林1.1:

Since Kotlin 1.1,擴展功能Map.toMapMap.toMutableMap創建副本。

+0

謝謝!它不適用於不可變的地圖,但仍然適用於可變的地圖。 –

+2

如果您希望結果是隻讀類型,請手動聲明類型或使用強制轉換:'val copy:Map = HashMap(original)'或'val copy = HashMap(original)as Map '。如果你反覆這樣做,寫一個擴展函數。 –

+2

@ N.Kudriavtsev地圖不是不可變的,它們只是從只讀接口訪問。所以上面的例子確實有效,如果你最終只使用readonly變量。 –

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 

你的方式看起來也習慣了我。

+1

謝謝你的回答!顯然,你想說'val copy = hashMapOf (); copy.putAll(map)'因爲putAll返回Unit。當然,它看起來比我的代碼更好,但是,它是一種Java方法,需要多條線,不能用不可變的映射。它真的是最好的方法嗎? –

+0

我糾正了這個例子。我沒有看到調用Java方法的問題,但不變性對於您的情況很重要,那麼您的方法看起來更好。 – marcospereira

+0

調用Java方法本身並不是一個問題,問題在於當原語操作需要多於一行代碼的語言被定位爲Scala的簡單替代品時。你的第二個變體要好得多。我認爲現在它是不可變的最佳變體,所以再次感謝你!不變對我來說並不重要,我只是感興趣。 –

1

這樣做的提出方式是:

map.toList().toMap() 

但是,Java的方法是快2〜3倍:

(map as LinkedHashMap).clone() 

無論如何,如果你煩惱,有沒有統一的方式克隆Kotlin的收藏(在Java中有!),投票在這裏:https://youtrack.jetbrains.com/issue/KT-11221

相關問題