В списке Котлина отсутствуют "добавить", "удалить" и т. д.?


в 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 70

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)

в концепции неизменяемых данных, может быть, это лучший способ:

class TempClass {
    val list: List<Int> by lazy {
        listOf<Int>()
    }
    fun doSomething() {
        list += 10
        list -= 10
    }
}