Comment copier une liste dans Kotlin?
J'utilise
val selectedSeries = mutableListOf<String>()
selectedSeries.addAll(series)
Y a-t-il un moyen plus facile?
Cela fonctionne bien.
val selectedSeries = series.toMutableList()
Je peux trouver deux manières alternatives:
1. val selectedSeries = mutableListOf<String>().apply { addAll(series) }
2. val selectedSeries = mutableListOf(*series.toTypedArray())
Mise à jour: avec le nouveau moteur Type Inference (opt-in dans Kotlin 1.3), nous pouvons omettre le paramètre de type générique dans le 1er exemple et obtenir ceci:
1. val selectedSeries = mutableListOf().apply { addAll(series) }
FYI.Le moyen d'inclure la nouvelle Inférence est kotlinc -Xnew-inference ./SourceCode.kt
pour la ligne de commande ou kotlin { experimental { newInference 'enable'}
pour Gradle. Pour plus d’informations sur la nouvelle inférence de type, consultez cette vidéo: KotlinConf 2018 - Nouvelle inférence de type et fonctionnalités de langage apparentées de Svetlana Isakova , en particulier "inférence pour les constructeurs" à 30 '
Vous pouvez utiliser
Liste -> toList ()
Tableau -> toArray ()
ArrayList -> toArray ()
MutableList -> toMutableList ()
Exemple:
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())
journal d'impression:
array: 4
arrayCopy: 4
array after remove: 3
arrayCopy after remove: 4
Si votre liste est en attente classe de données kotlin , vous pouvez le faire
selectedSeries = ArrayList(series.map { it.copy() })
Pour une copie peu profonde, je suggère
.map{it}
Cela fonctionnera pour de nombreux types de collection.
Je voudrais utiliser la méthode d'extension toCollection()
:
val original = listOf("A", "B", "C")
val copy = original.toCollection(mutableListOf())
Cela créera un nouveau MutableList
, puis ajoutera chaque élément de l'original à la liste nouvellement créée.
Le type inféré ici sera MutableList<String>
. Si vous ne souhaitez pas exposer la mutabilité de cette nouvelle liste, vous pouvez déclarer le type explicitement comme une liste immuable:
val copy: List<String> = original.toCollection(mutableListOf())
Juste comme en Java:
Liste:
val list = mutableListOf("a", "b", "c")
val list2 = ArrayList(list)
Carte:
val map = mutableMapOf("a" to 1, "b" to 2, "c" to 3)
val map2 = HashMap(map)
En supposant que vous visiez la machine virtuelle Java; Je ne suis pas sûr que cela fonctionne pour d'autres cibles, car il repose sur les constructeurs de copie de ArrayList et HashMap.