En Java, nous pourrions faire ce qui suit
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
Mais si nous le réécrivons directement sur Kotlin comme ci-dessous
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
J'ai eu l'erreur de ne pas trouver add
et de remove
fonctionner dans ma liste
Je travaille autour de la coulée vers ArrayList, mais c'est étrange de devoir la couler, alors qu'en Java la coulée n'est pas requise. Et cela va à l'encontre du but d'avoir la liste de classe abstraite
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
(myList!! as ArrayList).add(10)
(myList!! as ArrayList).remove(10)
}
}
Existe-t-il un moyen d'utiliser List sans avoir besoin de le diffuser, comme ce qui pourrait être fait en Java?
collections
kotlin
Elye
la source
la source
myList = null
, puis plus tard, appelez sans!!
. Vous pouvez surmonter cela en utilisant lelateinit
mot - clé devant votre propriété comme ceci: delateinit var myList: List<Int>
cette façon, vous n'aurez pas besoin d'initialiser la liste immédiatement, mais vous garantissez au compilateur que vous l'initialiserez avant d'utiliser la liste la première fois. C'est une solution plus fluide, mais elle vous impose une responsabilité en tant que développeur.Réponses:
https://kotlinlang.org/docs/reference/collections.html
Vous devrez utiliser une
MutableList
liste.MutableList<Int> = arrayListOf()
devrait également fonctionner.la source
Définir une collection List dans Kotlin de différentes manières:
Variable immuable avec liste immuable (lecture seule):
Variable immuable avec liste mutable:
ou sans valeur initiale - liste vide et sans type de variable explicite:
users.add(anohterUser)
ouusers += anotherUser
(sous le capot c'estusers.add(anohterUser)
)Variable mutable avec liste immuable:
ou sans valeur initiale - liste vide et sans type de variable explicite:
users += anotherUser
- * il crée une nouvelle ArrayList et l'affecte àusers
Variable mutable avec liste mutable:
ou sans valeur initiale - liste vide et sans type de variable explicite:
users.add(anohterUser)
users += anotherUser
voir aussi: https://kotlinlang.org/docs/reference/collections.html
la source
Acceptez toutes les réponses ci-dessus concernant l'utilisation de MutableList, mais vous pouvez également ajouter / supprimer de la liste et obtenir une nouvelle liste comme ci-dessous.
Ou
la source
Apparemment, la liste par défaut de Kotlin est immuable. Pour avoir une liste qui pourrait changer, il faut utiliser MutableList comme ci-dessous
Mise à jour Néanmoins, il n'est pas recommandé d'utiliser MutableList sauf pour une liste que vous souhaitez vraiment modifier. Fait référence à https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 pour savoir comment la collecte en lecture seule fournit un meilleur codage.
la source
MutableList
, mais l'initialiser avecnull
ne fonctionnera pas. Seuls les appels affirmés sûrs ou non nuls sont autorisés sur un récepteur de type nullableMutableList<Int>
.doSomething
lateinit
au lieu de rendre la liste annulable est la bonne façon d'aborder ce problème. Je ne me souviens pas si alateinit
été ajouté depuis le début de Kotlin, mais c'est certainement la solution de nos jours pour l'utiliser :-)Dans Kotlin, vous devez utiliser
MutableList
ouArrayList
.la source
Vous pouvez en créer un comme celui-ci.
Vous pouvez maintenant utiliser list2, merci.
la source
https://kotlinlang.org/docs/reference/collections.html
Selon le lien ci-dessus, la liste <E> est immuable dans Kotlin. Cependant, cela fonctionnerait:
la source
list2
s'agit d'une liste modifiable, voir stackoverflow.com/questions/43114367/… .Limiter la mutabilité aux constructeurs
Les meilleures réponses ici parlent correctement de la différence dans Kotlin entre lecture seule
List
(REMARQUE: il est en lecture seule, pas "immuable" ), etMutableList
.En général, on devrait s'efforcer d'utiliser des listes en lecture seule, cependant, la mutabilité est encore souvent utile au moment de la construction , en particulier lorsqu'il s'agit de bibliothèques tierces avec des interfaces non fonctionnelles. Dans les cas où d'autres techniques de construction ne sont pas disponibles, telles que l'utilisation
listOf
directe ou l'application d'une construction fonctionnelle commefold
oureduce
, une construction de "fonction de générateur" simple comme celle-ci produit bien une liste en lecture seule à partir d'une liste mutable temporaire:et cela peut être bien encapsulé dans une fonction utilitaire en ligne réutilisable:
qui peut être appelé comme ceci:
Désormais, toute la mutabilité est isolée dans une étendue de bloc utilisée pour la construction de la liste en lecture seule, et le reste de votre code utilise la liste en lecture seule qui est sortie du générateur.
MISE À JOUR : Depuis Kotlin 1.3.70, la
buildList
fonction exacte ci-dessus est disponible dans la bibliothèque standard en tant que fonction expérimentale, avec ses analoguesbuildSet
etbuildMap
. Voir https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/ .la source
Dans le concept de données immuables, c'est peut-être une meilleure façon:
la source
A
list
estimmutable
parDefault
, vous pouvez utiliser à laArrayList
place. comme ça :alors vous pouvez les
add/delete
articles de ce genre comme ci-dessous:la source