2015-05-28 13 views
7

Qual è il modo migliore per modificare un List immutabile in Kotlin?Lista modifiche Kotlin

Capisco che List in realtà non è immutabile, ma se sto passando un List in in una funzione e ho bisogno che tutta la lista meno un singolo elemento, c'è un modo supportato per gestire questo? Che dire se voglio l'intera lista con un elemento aggiuntivo?

risposta

12

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.

+2

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

+0

Esatto. Da un punto di vista del sistema di tipi, tuttavia, un elenco mutabile è sempre un elenco immutabile, mentre l'opposto non è il caso. –

+0

Kotlin 'Lista L'interfaccia' non è 'Immutable' ma piuttosto' read-only' ... piccola differenza per alcuni, enorme per gli altri. 'MutableList ' è ovviamente mutabile. –

2

Se si ha a che fare con elenchi immutabili, ciò che si vuole fare è creare nuove liste. Quindi nel tuo caso, se vuoi una lista senza un elemento, allora filtra quell'elemento (in Kotlin puoi usare la funzione filtro) e restituisci il nuovo elenco.