2016-02-27 11 views
20

Mi piacerebbe ottenere una nuova istanza di alcune mappe con lo stesso contenuto, ma la mappa non ha un metodo integrato copy. Posso fare qualcosa del genere:Qual è il modo più intelligente per copiare una mappa in Kotlin?

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

Ma sembra piuttosto brutto. C'è un modo più intelligente per fare questo?

+0

che è molto inefficiente, un sacco di oggetti temporanei assegnati – voddan

+0

@voddan lo so, questo è w Ho fatto questa domanda –

+0

penso che sia un bug: https://youtrack.jetbrains.com/issue/KT-11221 – voddan

risposta

31

Basta usare il HashMap costruttore:

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

Aggiornamento per Kotlin 1.1:

Since Kotlin 1.1, le funzioni di estensione Map.toMap e Map.toMutableMap creano copie.

+0

Grazie! Non funziona con mappe immutabili, ma è comunque ottimo per quelle mutevoli. –

+2

Se si desidera che il risultato sia di tipo di sola lettura, dichiarare il tipo manualmente o utilizzare un cast: 'val copy: Map = HashMap (originale)' o 'val copy = HashMap (originale) come Map '. Se lo fai ripetutamente, scrivi una funzione di estensione. –

+2

@ N. Le mappe di Kudriavtsev non sono immutabili, sono accessibili solo da un'interfaccia di sola lettura. Quindi l'esempio sopra funziona se lo mantieni con una variabile readonly alla fine. –

5

Uso putAll metodo:

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

Oppure:

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

Il tuo modo guarda anche idiomatica a me.

+1

Grazie per la risposta! Ovviamente, ti piacerebbe dire "val copy = hashMapOf (); copy.putAll (map) 'perché putAll restituisce Unit. Ovviamente sembra migliore del mio codice, tuttavia, è un metodo Java, prende più di una riga e non funziona con mappe immutabili. È davvero il modo migliore? –

+0

Ho corretto l'esempio. Non vedo un problema con la chiamata di un metodo Java, ma l'immutabilità è importante per il tuo caso, quindi il tuo metodo sembra migliore. – marcospereira

+0

Chiamare un metodo Java non è un problema in sé, il problema è quando l'operazione primitiva richiede più di una riga di codice in una lingua che è stata posizionata come un'alternativa semplice per Scala. La tua seconda variante è molto meglio. E penso che per ora sia la migliore variante per immutables, quindi grazie ancora una volta! L'immutabilità non è importante per me adesso, ero solo interessato. –

1

Il modo proposto di fare questo è:

map.toList().toMap() 

Tuttavia, il metodo di Java è da 2 a 3 volte più veloce:

(map as LinkedHashMap).clone() 

In ogni caso, se ti dà fastidio che non c'è modo unificato di clonazione delle collezioni di Kotlin (e c'è in Java!), vota qui: https://youtrack.jetbrains.com/issue/KT-11221

Problemi correlati