В списке Котлина отсутствуют "добавить", "удалить" и т. д.?
в Java мы могли бы сделать следующее
public class TempClass {
List<Integer> myList = null;
void doSomething() {
myList = new ArrayList<>();
myList.add(10);
myList.remove(10);
}
}
но если мы перепишем его в Котлин напрямую, как показано ниже
class TempClass {
var myList: List<Int>? = null
fun doSomething() {
myList = ArrayList<Int>()
myList!!.add(10)
myList!!.remove(10)
}
}
я получил ошибку не найти add
и
6 ответов:
В отличие от многих языков, Kotlin различает изменяемые и неизменяемые коллекции (списки, наборы, карты и т. д.). Точный контроль над тем, когда именно коллекции могут быть отредактированы, полезен для устранения ошибок и для разработки хороших API.
https://kotlinlang.org/docs/reference/collections.html
вам нужно использовать
MutableList
список.class TempClass { var myList: MutableList<Int> = mutableListOf<Int>() fun doSomething() { // myList = ArrayList<Int>() // initializer is redundant myList.add(10) myList.remove(10) } }
MutableList<Int> = arrayListOf()
также должны работать.
определение коллекции списков в Котлине по-разному:
неизменяемая переменная с неизменяемым (только для чтения) списком:
val users: List<User> = listOf( User("Tom", 32), User("John", 64) )
неизменяемая переменная с изменяемым списком:
val users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
или без начального значения - пустой список и без явной переменной типа:
val users = mutableListOf<User>() //or val users = ArrayList<User>()
- вы можете добавить элементы в список:
users.add(anohterUser)
илиusers += anotherUser
(под капотомusers.add(anohterUser)
)
изменяемая переменная с неизменяемым списком:
var users: List<User> = listOf( User("Tom", 32), User("John", 64) )
или без начального значения - пустой список и без явной переменной типа:
var users = emptyList<User>()
- Примечание: Вы можете добавить* элементы в список:
users += anotherUser
- *он создает ArrayList и присваивает егоusers
изменяемая переменная с изменяемым списком:
var users: MutableList<User> = mutableListOf( User("Tom", 32), User("John", 64) )
или без начального значения - пустой список и без явной переменной типа:
var users = emptyList<User>().toMutableList() //or var users = ArrayList<User>()
- Примечание: Вы можете добавить элементы в список:
users.add(anohterUser)
- а не через
users += anotherUser
Ошибка: Котлин: Неоднозначность операторов присваивания:
общественный оператор fun Collection.плюс (элемент: строка): список, определенный в kotlin.коллекции
@InlineOnly public inline operator fun MutableCollection.plusAssign (element: String): единица измерения, определенная в kotlin.коллекции
смотреть также: https://kotlinlang.org/docs/reference/collections.html
по-видимому, список по умолчанию Kotlin является неизменным. Чтобы иметь список, который может измениться, следует использовать MutableList, как показано ниже
class TempClass { var myList: MutableList<Int>? = null fun doSomething() { myList = ArrayList<Int>() myList!!.add(10) myList!!.remove(10) } }
Обновлено Тем не менее, не рекомендуется использовать MutableList, если только для списка, который вы действительно хотите изменить. Относится к https://hackernoon.com/read-only-collection-in-kotlin-leads-to-better-coding-40cdfa4c6359 для того, как коллекция только для чтения обеспечивает лучшее кодирование.
https://kotlinlang.org/docs/reference/collections.html
согласно приведенному выше списку ссылок
является неизменным в Котлине. Однако это будет работать: var list2 = ArrayList<String>() list2.removeAt(1)
согласен со всеми вышеперечисленными ответами на использование MutableList, но вы также можете добавить/удалить из списка и получить новый список, как показано ниже.
val newListWithElement = existingList + listOf(element) val newListMinusElement = existingList - listOf(element)
или
val newListWithElement = existingList.plus(element) val newListMinusElement = existingList.minus(element)