Intereting Posts
Kotlin Generics и nullable Тип класса Инструментальные тесты не могут выполняться в библиотечных модулях Android с файлами Kotlin котлин с пружинной нагрузкой на затмение ReferenceError: ok не определен в QUnitAsserter.assertTrue в Kotlin Javascript Как реализовать ленивое свойство в Котлине, которое требует другого имущества? Как работает синтаксис доступа к свойствам Kotlin для классов Java (например, EditText setText)? В чем разница между arrayListOf и mutableListOf, какая из них лучше? Внутренние классы Kotlin в Java видимы публично Ошибка сборки: ошибка: выполнение не выполнено для задачи: app: compileLightningLiteDebugKotlin '. > Ошибка компиляции Создание ArrayList уникальных элементов в ArrayList Скомпилированные файлы kt состоят из байт-кодов? Ошибка сопоставления коллекции с JPA + Kotlin Android: запустите 4 async-задачи (которые работают с Rest API), подождите и начните еще одно действие после выполнения всех задач к сожалению, приложение остановило студию Android, и нет ошибки torgadoFX togglebutton не имеет текстового свойства

Основы Kotlin: как добавить или установить элемент карты?

Я хотел бы добавить / установить элементы изменчивой карты с определенными парами ключ-значение. До сих пор я понял, что могу добавить новые элементы, используя оператор плюс вместе с типом данных Pair:

var arr3:Map<Any, Any> = mutableMapOf() arr3 += Pair("manufacturer", "Weyland-Yutani") //also, the "to" operator works too: //arr3 += ("manufacturer" to "Weyland-Yutani") 

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

 arr3["manufacturer"] = "Seegson" // gives an error( Kotlin: No set method providing array access) arr3["manufacturer"] to "Seegson" // compiles, but nothing is added to the array 

Не могли бы вы рассказать мне, как это сделать?

Вы объявили mutable arr3 с явным типом Map<Any, Any> . Map ) не допускает мутации. Оператор += создает новый экземпляр карты и arr3 переменную arr3 . Чтобы изменить содержимое карты, объявите arr3 как MutableMap следующим образом:

 var arr3:MutableMap<Any, Any> = mutableMapOf() 

или более идиоматический

 var arr = mutableMapOf<Any, Any>() 

Обратите внимание, что обычно вам нужен либо изменяемый переменный var либо изменяемый тип экземпляра MutableMap но из моего опыта редко оба.

Другими словами, вы можете использовать изменяемую переменную с неизменяемым типом:

 var arr = mapOf<Any,Any>() 

и используйте оператор += чтобы изменить, где arr указывает.

Или вы можете использовать MutableMap с неизменяемой переменной arr и изменять содержимое где arr указывает на:

 val arr = mutableMapOf<Any,Any>() 

Очевидно, что вы можете изменять MutableMap содержимое MutableMap . Поэтому arr["manufacturer"] = "Seegson" будет работать только с переменной, объявленной как таковая.

Что касается операций add / set, они могут быть выполнены на MutableMap<K, V> (а не только на Map<K, V> ) и могут выполняться несколькими способами:

  • Вызов Java-стиля:

     arr3.put("manufacturer", "Seegson") 

    Этот вызов возвращает значение, которое ранее было связано с ключом, или значение null .

  • Более идиоматический вызов Котлина с использованием оператора set :

     arr["matufacturer"] = "Seegson" 
  • plusAssign оператора plusAssign :

     arr += "manufacturer" to "Seegson" 

    Этот параметр вводит накладные расходы на Pair созданную до вызова, и менее читабельна, поскольку ее можно путать с переназначением var (также, это не применимо для var s из-за неоднозначности), но все же полезно, когда у вас уже есть Pair которая вы хотите добавить.