Jak zainicjować MutableList Kotlin, aby opróżnić MutableList?

241

Wydaje się to takie proste, ale jak zainicjować Kotlina, MutableListaby go opróżnić MutableList?

Mogę to zhakować w ten sposób, ale jestem pewien, że jest coś łatwiejszego:

var pusta: List<Kolory> = emptyList()
var cos: MutableList<Kolory> = pusta.toArrayList()
ssuukk
źródło

Odpowiedzi:

436

Możesz po prostu napisać:

val mutableList = mutableListOf<Kolory>()

To najbardziej idiomatyczny sposób.

Alternatywne sposoby to

val mutableList : MutableList<Kolory> = arrayListOf()

lub

val mutableList : MutableList<Kolory> = ArrayList()

Wykorzystuje to fakt, że typy java ArrayListdomyślnie implementują ten typ MutableListza pomocą sztuczki kompilatora.

Kirill Rakhman
źródło
Potrzebujesz coś zaimportować? Kiedy piszę to w moim bieżącym projekcie, otrzymuję nierozwiązaną referencję arrayListOf i to samo, jeśli spróbuję mutableListOf
vextorspace
Czy masz stdlib w swojej ścieżce klas?
Kirill Rakhman
Musiałem tylko zmienić flagę kotlin_version w moim build.gradle z powrotem na 1.1.0 zamiast 1.1.1
vextorspace
1
@androiddeveloper to dlatego, że niekotlin.collections.List jest . Kotlin ma mechanizm mapowania niektórych wbudowanych typów Java. Proszę zapoznać się z kotlinlang.org/docs/reference/java-interop.html#mapped-types i podobnymi pytaniami SO. Sekcja komentarzy nie jest odpowiednia do szczegółowego omawiania tego. java.utils.List
Kirill Rakhman
1
@Mohanakrrishna tak, funkcje obsługują przekazywanie argumentów.
Kirill Rakhman
17

Różne formy w zależności od typu listy, dla listy tablic:

val myList = mutableListOf<Kolory>() 
// or more specifically use the helper for a specific list type
val myList = arrayListOf<Kolory>()

W przypadku LinkedList:

val myList = linkedListOf<Kolory>()
// same as
val myList: MutableList<Kolory> = linkedListOf()

W przypadku innych typów list zostanie przyjęty Zmienny, jeśli zbudujesz je bezpośrednio:

val myList = ArrayList<Kolory>()
// or
val myList = LinkedList<Kolory>()

Odnosi się to do wszystkiego, co implementuje Listinterfejs (tj. Innych bibliotek kolekcji).

Nie trzeba powtarzać typu po lewej stronie, jeśli lista jest już zmienna. Lub tylko jeśli chcesz traktować je jako tylko do odczytu, na przykład:

val myList: List<Kolory> = ArrayList()
Jayson Minard
źródło
Co jeśli wiem rozmiar nowej MutableList? W przypadku ArrayList mogę zrobić: ArrayList(24)na przykład, jeśli uważam, że 24 to dobry początek, prawdopodobnie nie będzie potrzebował więcej.
programista Androida
@androiddeveloper Przeglądaj dokumenty dla konstruktorów list lub API Java dla bazowych list, a zobaczysz opcje tego, co chcesz.
Jayson Minard
zapomniałeś o mutableListOf. Prawidłowe byłoby:val myList = arrayListOf<Kolory>() // same as // val myList = mutableListOf<Kolory>()
user924
10

Lubię poniżej, aby:

var book: MutableList<Books> = mutableListOf()

/ ** Zwraca nową [MutableList] z podanymi elementami. * /

public fun <T> mutableListOf(vararg elements: T): MutableList<T>
    = if (elements.size == 0) ArrayList() else ArrayList(ArrayAsCollection(elements, isVarargs = true))
Chang
źródło