Se si sta creando l'elenco da soli, invece di chiamare listOf("foo", "bar")
chiamare mutableListOf("foo", "bar")
per ottenere un'istanza di MutableList
.
Se si ottiene l'elenco, ad es. come parametro per un metodo, chiamare toMutableList()
su di esso per ottenere una copia mutabile copia.
In alternativa utilizzare uno dei tanti metodi di estensione built-in come map()
o filter()
per ottenere un nuovo elenco con gli elementi modifed. Ad esempio, per ottenere una lista senza i primi n elementi utilizzare drop(n)
. Per ottenere solo i primi n elementi chiamare take(n)
. Here puoi trovare altri metodi di estensione incorporati.
Se è necessario unire due elenchi, utilizzare semplicemente l'operatore più come questo: val newList = list1 + list2
.
Nota, che modificare gli elenchi che sono parametri per i metodi può essere un odore di codice. Ecco perché tutti i metodi integrati restituiscono copie. Anche il tuo asumption
Capisco che List non è in realtà immutabile
è sbagliato. Come si può vedere here, la libreria standard restituirà una lista vuota immutabile se si chiama listOf()
senza argomenti.
In Java l'interfaccia List
è modificabile per impostazione predefinita e può causare eccezioni quando si tenta di modificare un elenco immutabile come quello creato chiamando lo Arrays.asList()
. Ecco perché a Kotlin è il contrario.
fonte
2015-05-28 14:28:27
Se si dispone di un ArrayList e lo si passa come elenco, tale elenco non è effettivamente immutabile. Questo è ciò che intendevo dire che non è in realtà immutabile. – spierce7
Esatto. Da un punto di vista del sistema di tipi, tuttavia, un elenco mutabile è sempre un elenco immutabile, mentre l'opposto non è il caso. –
Kotlin 'Lista L'interfaccia' non è 'Immutable' ma piuttosto' read-only' ... piccola differenza per alcuni, enorme per gli altri. 'MutableList ' è ovviamente mutabile. –