Wie kopiere ich eine Liste in Kotlin?
Ich benutze
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Gibt es einen einfacheren Weg?
Das funktioniert gut.
val selectedSeries = series.toMutableList()
Ich kann zwei alternative Wege finden:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Update: Mit der neuen Type Inference Engine (Opt-In in Kotlin 1.3) können wir den generischen Typparameter im 1. Beispiel weglassen und haben Folgendes:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
Der Weg, neue Inferenz zu aktivieren, ist kotlinc -Xnew-inference ./SourceCode.kt
für Befehlszeile oder kotlin { experimental { newInference 'enable'}
für Gradle. Weitere Informationen zur neuen Typinferenz finden Sie in folgendem Video: KotlinConf 2018 - Neue Typinferenz und verwandte Sprachfunktionen von Svetlana Isakova , insbesondere 'Inferenz für Builder' bei 30 '
Sie können verwenden
Liste -> toList ()
Array -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Beispiel:
val array = arrayListOf("1", "2", "3", "4")
val arrayCopy = array.toArray() // copy array to other array
Log.i("---> array " , array?.count().toString())
Log.i("---> arrayCopy " , arrayCopy?.count().toString())
array.removeAt(0) // remove first item in array
Log.i("---> array after remove" , array?.count().toString())
Log.i("---> arrayCopy after remove" , arrayCopy?.count().toString())
Protokoll drucken:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Wenn Ihre Liste Kotlin-Datenklasse enthält, können Sie dies tun
selectedSeries = ArrayList(series.map { it.copy() })
Für eine flache Kopie schlage ich vor
.map{it}
Das funktioniert bei vielen Sammlungsarten.
Ich würde die toCollection()
-Erweiterungsmethode verwenden:
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Dies erstellt ein neues MutableList
und fügt dann jedes Element des Originals der neu erstellten Liste hinzu.
Der hier abgeleitete Typ ist MutableList<String>
. Wenn Sie die Änderbarkeit dieser neuen Liste nicht offen legen möchten, können Sie den Typ explizit als unveränderliche Liste deklarieren:
val copy: List<String> = original.toCollection(mutableListOf())
Genau wie in Java:
Liste:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
Karte:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
Angenommen, Sie zielen auf die JVM ab. Ich bin nicht sicher, ob es für andere Ziele funktioniert, da es auf den Kopierkonstruktoren von ArrayList und HashMap basiert.