Как я могу инициализировать MutableList Kotlin, чтобы очистить MutableList?

242

Кажется, все так просто, но как я могу инициализировать Kotlin's MutableListпустыми MutableList?

Я мог бы взломать это таким образом, но я уверен, что есть что-то более доступное:

var pusta: List<Kolory> = emptyList()
var cos: MutableList<Kolory> = pusta.toArrayList()
ssuukk
источник

Ответы:

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 . Kotlin имеет механизм для отображения некоторых встроенных типов 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()

Для других типов списков предполагается Mutable, если вы создаете их напрямую:

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

Это относится ко всему, что реализует List интерфейс (то есть для других библиотек коллекций).

Нет необходимости повторять тип с левой стороны, если список уже изменчив. Или только если вы хотите обрабатывать их только для чтения, например:

val myList: List<Kolory> = ArrayList()
Джейсон Минард
источник
Что если я знаю размер нового MutableList? Для ArrayList я могу сделать: ArrayList(24)например, если я думаю, что 24 - хорошее начало для него, то, вероятно, ему не понадобится больше, чем это.
Android-разработчик
@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))
Чанг
источник