Як ініціалізувати MutableList Котліна, щоб виповнити MutableList?


241

Здається, це так просто, але як я ініціалізую Котліна MutableListдо порожнього MutableList?

Я міг би зламати це так, але я впевнений, що є щось легше:

var pusta: List<Kolory> = emptyList()
var cos: MutableList<Kolory> = pusta.toArrayList()

Відповіді:


436

Ви можете просто написати:

val mutableList = mutableListOf<Kolory>()

Це самий ідіоматичний спосіб.

Альтернативні шляхи є

val mutableList : MutableList<Kolory> = arrayListOf()

або

val mutableList : MutableList<Kolory> = ArrayList()

Це використовує той факт, що такі типи java ArrayListнеявно реалізують тип MutableListза допомогою трюку компілятора.


Вам потрібно щось імпортувати? Коли я пишу це в своєму поточному проекті, я отримую невирішений посилання arrayListOf і те саме, якщо я спробую mutableListOf
vextorspace

У вас є stdlib на вашому занятті?
Кирило Рахман

Мені просто довелося переключити прапор kotlin_version у своєму build.gradle назад на 1.1.0 замість 1.1.1
vextorspace

1
@androiddeveloper це тому, що kotlin.collections.Listце не так java.utils.List . У Котліна є механізм відображення деяких вбудованих типів Java. Будь ласка, зверніться до kotlinlang.org/docs/reference/java-interop.html#mapped-types та подібні питання SO. Розділ коментарів не підходить для детального обговорення цього питання.
Кирило Рахман

1
@Mohanakrrishna так, функції підтримують передавання аргументів.
Кирило

17

Різні форми залежно від типу списку для списку масивів:

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

Для LinkedList:

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

Для інших типів списку буде вважатися змінним, якщо ви побудуєте їх безпосередньо:

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

Це справедливо для будь-якої реалізації Listінтерфейсу (тобто інших бібліотек колекцій).

Не потрібно повторювати тип ліворуч, якщо список уже змінюється. Або лише якщо ви хочете розглянути їх як лише для читання, наприклад:

val myList: List<Kolory> = ArrayList()

Що робити, якщо я знаю розмір нового MutableList? Для ArrayList я можу зробити: ArrayList(24)наприклад, якщо я вважаю, що 24 - це гарний старт для цього, він, ймовірно, не потребуватиме більше, ніж він.
андроїд розробник

@androiddeveloper Перегляньте документи для конструкторів списку або Java API для базових списків, і ви побачите варіанти того, що вам потрібно.
Джейсон Мінард

ви про це забули mutableListOf. Правильним було б:val myList = arrayListOf<Kolory>() // same as // val myList = mutableListOf<Kolory>()
user924

10

Я люблю нижче:

var book: MutableList<Books> = mutableListOf()

/ ** Повертає новий [MutableList] із заданими елементами. * /

public fun <T> mutableListOf(vararg elements: T): MutableList<T>
    = if (elements.size == 0) ArrayList() else ArrayList(ArrayAsCollection(elements, isVarargs = true))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.