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()

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.


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()

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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.