Error no set method providing array access

No get Method Array Access #1 Comments Category[categoryId] — > in CategoryList.kt gives error stating [No get Method providing array access] The text was updated successfully, but these errors were encountered: Modifying it to Category.get(categoryId) , at least does not give error while editing Looks like a bug in Kotlin plugin for Intellij — […]

Содержание

  1. No get Method Array Access #1
  2. Comments
  3. Основы Kotlin: как добавить или установить элемент карты?
  4. 2 ответа
  5. Русские Блоги
  6. «Минималистский учебник Котлина». Глава 5 Коллекционный класс (2)
  7. «Kotlin Minimalist Tutorial» официально запущен:
  8. Нажмите здесь>Пойдите в торговый центр Jingdong, чтобы купить и прочитать
  9. Нажмите здесь>Пойдите в торговый центр Tmall, чтобы купить и прочитать
  10. Спасибо большое, дорогие читатели, пожалуйста, поддержите! ! ! Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь общаться со мной
  11. 5.5 Map
  12. 5.5.1 Обзор карты
  13. 5.5.2 Создание карты
  14. mapOf()
  15. mapOf(pair: Pair ): Map
  16. mutableMapOf()
  17. mutableMapOf(vararg pairs: Pair ): MutableMap
  18. hashMapOf(): HashMap
  19. linkedMapOf(): LinkedHashMap
  20. linkedMapOf(vararg pairs: Pair ): LinkedHashMap
  21. sortedMapOf(vararg pairs: Pair ): SortedMap
  22. 5.5.3 Доступ к элементам карты
  23. атрибут записей
  24. атрибут ключа
  25. атрибут значений
  26. атрибут размера
  27. get(key: K)
  28. 5.5.4 Функции оператора карты
  29. containsKey(key: K): Boolean
  30. containsValue(value: V): Boolean
  31. component1() component2()
  32. Map.Entry .toPair(): Pair
  33. getOrElse(key: K, defaultValue: () -> V): V
  34. getValue(key: K): V
  35. getOrPut(key: K, defaultValue: () -> V): V
  36. iterator(): Iterator >
  37. mapKeys(transform: (Map.Entry ) -> R): Map
  38. mapValues(transform: (Map.Entry ) -> R): Map
  39. filterKeys(predicate: (K) -> Boolean): Map
  40. filterValues(predicate: (V) -> Boolean): Map
  41. filter(predicate: (Map.Entry ) -> Boolean): Map
  42. Iterable
  43. Map .toMutableMap(): MutableMap
  44. plus minus
  45. put(key: K, value: V): V?
  46. putAll(from: Map ): Unit
  47. MutableMap .remove(key: K): V?
  48. MutableMap .clear(): Unit
  49. Краткое содержание этой главы
  50. Интеллектуальная рекомендация
  51. IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS
  52. Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis
  53. 1086 Не скажу (15 баллов)
  54. Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных
  55. PureMVC Learning (Tucao) Примечания

No get Method Array Access #1

Category[categoryId] — > in CategoryList.kt gives error stating [No get Method providing array access]

The text was updated successfully, but these errors were encountered:

Modifying it to Category.get(categoryId) , at least does not give error while editing

Looks like a bug in Kotlin plugin for Intellij — it should auto-import the [] operator. If you agree, could you please file a bug for the Kotlin plugin in the Jetbrains bug tracker?

Workaround is to place the cursor at the [ character and press Alt+Enter and choose Import — that should fix the import and fix the compilation error.

i believe using Category.get(categoryId) will not give any functional issue?

It will not give any functional issue: Category[25] and Category.get(25) is completely the same thing. Kotlin compiler emits the very same code for both notations.

It’s actually the «indexed access operator» overload (you can learn more about it here: https://kotlinlang.org/docs/reference/operator-overloading.html ). It may however look confusing since the get method is on a Class, rather than on an instance.

why shall we use Category[categoryId], will it search for Category.id = value or is it the element of a array?

Category[categoryId] is just a short-hand for Category.get(categoryId) . That means that vok-orm will in both cases go and fetch the category with given ID.

It only looks like an access to an array; it’s really a select * from Category where >. The original intent was that Category class is an image for the category database table which is a list of categories; hence Category[id] would fetch just a single item from the list.

You should be able to verify this, by ctrl -clicking on the [ character — Kotlin plugin should then navigate you to the get method. However, because of a bug in Kotlin plugin this sometimes does not work.

Источник

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

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

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

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

2 ответа

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

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

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

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

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

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

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

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

put вызов в стиле Java:

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

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

Синтаксис оператора plusAssign :

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

Источник

Русские Блоги

«Минималистский учебник Котлина». Глава 5 Коллекционный класс (2)

«Kotlin Minimalist Tutorial» официально запущен:

Нажмите здесь>Пойдите в торговый центр Jingdong, чтобы купить и прочитать

Нажмите здесь>Пойдите в торговый центр Tmall, чтобы купить и прочитать

Спасибо большое, дорогие читатели, пожалуйста, поддержите! ! ! Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь общаться со мной

5.5 Map

5.5.1 Обзор карты

Карта представляет собой коллекцию, которая отображает ключевой объект Key и значение объекта Value, каждый элемент которого содержит пару ключевого объекта и объекта значения (K-V Pair). Ключ можно рассматривать как индекс значения, а объект как ключ нельзя повторить в коллекции (uniq).

Если мы посмотрим на суть структуры данных, List на самом деле является специальной картой, ключ которой является индексом типа Int. Набор также является специальной картой, ключ которой равен Int, но значение значения не может быть повторено.

Карта в Kotlin такая же, как List и Set.Карта также делится на Map только для чтения и переменную MutableMap

Карта не наследуется от интерфейса Коллекции. Структура его диаграммы классов выглядит следующим образом:

В интерфейсе interface Map Где K — тип значения ключа, а V — тип соответствующего сопоставленного значения. здесь out V Представляет подкласс типа V или V. Это общие знания, которые мы представим в следующей главе.

Среди них Entry На карте хранятся пары ключ-значение.

5.5.2 Создание карты

В отличие от Java, карта в Kotlin различает карту только для чтения и редактируемую карту (MutableMap, HashMap, LinkedHashMap).

Котлин не реализовал повторно набор классов коллекций, но сделал некоторые расширения на основе классов коллекций Java.

Мы знаем, что в Java, согласно различным внутренним структурам данных, интерфейс Map обычно имеет несколько классов реализации.

Среди них обычно используются:

HashMap — это реализация интерфейса Map, основанная на хеш-таблице и существующая в форме ключ-значение. В HashMap ключ-значение является целым, система рассчитает место хранения значения ключа в соответствии с алгоритмом хеширования, мы можем быстро получить доступ к значению через ключ. Это позволяет нулевые значения и нулевые ключи.

Кроме того, порядок элементов в HashMap будет меняться со временем.

Реализация интерфейса Map с использованием красно-черного дерева.

Существует также LinkedHashMap, который наследует HashMap и использует связанные списки. LinkedHashMap сохраняет порядок вставки записей.При переборе LinkedHashMap с помощью Iterator первая полученная запись является первой вставленной записью. Проще говоря, LinkedHashMap упорядочен и использует связанные списки для поддержания внутреннего порядка.

Когда мы используем Kotlin для создания Map, большинство из них фактически вызывают метод Java Map.

Ниже мы расскажем о создании карты и основных функциях работы.

mapOf()

Создать пустую карту только для чтения.

Мы также можем использовать другую функцию для создания пустой карты:

Пустые карты все равны:

Эта пустая карта доступна только для чтения, а ее свойства и возвращаемые функции предопределены. Код выглядит следующим образом:

mapOf(pair: Pair ): Map

Создайте карту только для чтения, используя пару Pair.

Внутри этой функции создания вызывается конструктор LinkedHashMap, и связанный с ним код выглядит следующим образом:

Если мы хотим отредактировать эту карту, компилятор напрямую сообщит об ошибке

Потому что в неизменяемых картах функция set вообще отсутствует.

mutableMapOf()

Создайте пустую переменную Map.

Эта функция напрямую называется конструктором LinkedHashMap ().

mutableMapOf(vararg pairs: Pair ): MutableMap

Создайте редактируемый объект MutableMap.

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

назад 1 to «z» Прямо поставить перед 1 to «x» Накрыл.

hashMapOf(): HashMap

Создайте объект HashMap. Котлин напрямую использует HashMap из Java.

linkedMapOf(): LinkedHashMap

Создайте пустой объект LinkedHashMap. Непосредственно используется LinkedHashMap в Java.

linkedMapOf(vararg pairs: Pair ): LinkedHashMap

Создайте объект LinkedHashMap с парой элементов Pair. Непосредственно используется LinkedHashMap в Java.

sortedMapOf(vararg pairs: Pair ): SortedMap

Создайте TreeMap, отсортированный в порядке возрастания ключа. Соответствующим является использование SortedMap в Java.

5.5.3 Доступ к элементам карты

атрибут записей

Мы можем напрямую получить доступ к записи недвижимости

Получить набор всех пар ключ / значение на этой карте. Тип Entry определяется следующим образом:

Таким образом, мы можем пройти этот входной набор:

атрибут ключа

Получите доступ к атрибуту keys:

Получить набор всех ключей на карте.

атрибут значений

доступ val values: Collection Получить коллекцию всех значений на карте. Этот набор значений может содержать повторяющиеся значения.

атрибут размера

доступ val size: Int Получите количество пар ключ / значение карты.

get(key: K)

Мы используем функцию get для получения значения по ключу.

Если ключ отсутствует на карте, он возвращает ноль.

Если вы не хотите возвращать null, вы можете использовать функцию getOrDefault

Когда он равен нулю, он не возвращает ноль, но возвращает набор значений по умолчанию:

Тип этого значения по умолчанию соответствует V. Несоответствие типов сообщит об ошибке:

5.5.4 Функции оператора карты

containsKey(key: K): Boolean

Стоит ли включать ключ.

containsValue(value: V): Boolean

Стоит ли включать значение.

component1() component2()

Map.Entry Функции оператора используются для прямого доступа к ключу и значению соответственно.

Определения этих двух функций следующие:

Map.Entry .toPair(): Pair

Конвертировать карту входа в пару.

getOrElse(key: K, defaultValue: () -> V): V

Получить значение по ключу. Если значение отсутствует, вы можете установить значение по умолчанию.

getValue(key: K): V

Если этот ключ не существует в Map, вызовите функцию get.Если вы не хотите возвращать null, выведите исключение напрямую, вы можете вызвать этот метод.

getOrPut(key: K, defaultValue: () -> V): V

Если ключ не существует, добавьте его на карту, и соответствующее значение будет defaultValue.

iterator(): Iterator >

Что возвращает эта функция entries.iterator() , Таким образом, мы можем использовать цикл for для обхода карты следующим образом:

mapKeys(transform: (Map.Entry ) -> R): Map

Установите Key of the Map на значение после сопоставления через функцию преобразования.

Обратите внимание, что это Ввод карты.
Если, к сожалению, после сопоставления любые два ключа равны, то следующие ключи будут перезаписывать предыдущие ключи.

Мы можем видеть, что 1 to «a» есть -1 to «z» Накрыл.

mapValues(transform: (Map.Entry ) -> R): Map

Соответствующая функция должна установить значение Map на новое значение после преобразования с помощью функции преобразования transform.

filterKeys(predicate: (K) -> Boolean): Map

Вернуть новую Карту, составленную из элементов, которые удовлетворяют основным условиям оценки.

Обратите внимание, что элементом it здесь является Key.

filterValues(predicate: (V) -> Boolean): Map

Вернуть новую карту, состоящую из элементов, которые удовлетворяют условиям оценки стоимости.

Обратите внимание, что элемент it здесь является значением.

filter(predicate: (Map.Entry ) -> Boolean): Map

Вернуть новую Карту, состоящую из элементов, которые удовлетворяют условиям оценки вступления.

Iterable

>.toMap(destination: M): M

Преобразуйте коллекцию Iterable, содержащую пару, в карту.

Map .toMutableMap(): MutableMap

Преобразуйте карту только для чтения в редактируемую MutableMap.

plus minus

Функции оператора добавления карты следующие:

Добавить и назначить функции:

Вычитание похоже на сложение.

put(key: K, value: V): V?

Установите значение элемента в соответствии с ключом. Если ключ существует, обновите значение, если он не существует, добавьте его, но возвращаемое значение put равно нулю.

putAll(from: Map ): Unit

Добавить карту в MutableMap.

Если есть повторяющиеся ключи, следующие значения перезапишут предыдущие значения:

MutableMap .remove(key: K): V?

Удалить элемент в соответствии со значением ключа.

MutableMap .clear(): Unit

Краткое содержание этой главы

В этой главе мы представим классы коллекций List, Set, Map в стандартной библиотеке Kotlin и расширенные функциональные функции, которые они расширяют. Эти функции облегчают нам использование этих классов коллекций.

Класс коллекции содержит объекты, и как правильно указать тип объекта — это то, на что мы должны обратить внимание в процессе написания кода. В следующей главе мы узнаем о дженериках.

Интеллектуальная рекомендация

IView CDN Загрузка значка шрифта нормальная, а значок шрифта не может быть загружен при локальной загрузке JS и CSS

Используйте iview, чтобы сделать небольшой инструмент. Чтобы не затронуть другие платформы, загрузите JS и CSS CDN на локальные ссылки. В результате значок шрифта не может быть загружен. Просмо.

Критическое: ошибка настройки прослушивателя приложения класса org.springframework.web.context.ContextLoaderLis

1 Обзор Серверная программа, которая обычно запускалась раньше, открылась сегодня, и неожиданно появилась эта ошибка. Интуитивно понятно, что не хватает связанных с Spring пакетов, но после удаления п.

1086 Не скажу (15 баллов)

При выполнении домашнего задания друг, сидящий рядом с ним, спросил вас: «Сколько будет пять умножить на семь?» Вы должны вежливо улыбнуться и сказать ему: «Пятьдесят три». Это.

Pandas применяют параллельный процесс приложения, многоядерная скорость очистки данных

В конкурсе Algorith Algorith Algorith Algorith Algorith 2019 года используется многофункциональная уборка номера ускорения. Будет использовать панды. Но сама панда, кажется, не имеет механизма для мно.

PureMVC Learning (Tucao) Примечания

Справочная статья:Введение подробного PrueMVC Использованная литература:Дело UnityPureMvc Основная цель этой статьи состоит в том, чтобы организовать соответствующие ресурсы о PureMVC. Что касается Pu.

Источник

have an issue with setting uuid

and the table looks like this

object Creators : Table() {
    val userId = uuid("id").uniqueIndex().references(Users.id)
    val workingEmail = varchar("workingEmail", 150)
}

the error in next code

 transaction {
                        Creators.insert {
                            it[workingEmail] = "helllo"
                            it[userId] = userId // this UUID which I am geting in other part
                        }
                    }

is

None of the following functions can be called with the arguments supplied.
set(Column<TypeVariable(ID)>, TypeVariable(E))   where S = TypeVariable(S), ID = TypeVariable(ID), E = TypeVariable(E) for    fun <S, ID : EntityID<S>, E : Expression<S>> set(column: Column<ID>, value: E): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
set(Column<TypeVariable(ID)>, TypeVariable(S))   where S = TypeVariable(S), ID = TypeVariable(ID) for    fun <S : Comparable<S>, ID : EntityID<S>> set(column: Column<ID>, value: S): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
set(Column<TypeVariable(S)>, TypeVariable(S))   where S = TypeVariable(S) for    fun <S> set(column: Column<S>, value: S): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
set(Column<TypeVariable(S)>, Query)   where S = TypeVariable(S) for    fun <S> set(column: Column<S>, value: Query): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
set(Column<TypeVariable(T)>, TypeVariable(E))   where T = TypeVariable(T), S = TypeVariable(S), E = TypeVariable(E) for    fun <T, S : T, E : Expression<S>> set(column: Column<T>, value: E): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
set(Column<EntityID<TypeVariable(S)>?>, TypeVariable(S)?)   where S = TypeVariable(S) for    fun <S : Comparable<S>> set(column: Column<EntityID<S>?>, value: S?): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
set(CompositeColumn<TypeVariable(S)>, TypeVariable(S))   where S = TypeVariable(S) for    fun <S : Any> set(column: CompositeColumn<S>, value: S): Unit defined in org.jetbrains.exposed.sql.statements.InsertStatement
No set method providing array access

Я хотел бы добавить / установить элементы изменяемой карты с конкретными парами ключ-значение. До сих пор я понял, что могу добавлять новые элементы с помощью оператора плюс вместе с типом данных 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

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

2 ответа

Лучший ответ

Вы объявили изменяемый arr3 с явным типом Map<Any, Any>. Map) не допускает мутаций , Оператор += создает новый экземпляр карты и изменяет переменную 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. Так что arr["manufacturer"] = "Seegson" будет работать только с переменной, которая объявлена как таковая.


20

miensol
6 Мар 2017 в 13:51

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

  • put вызов в стиле Java:

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

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

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

    arr["matufacturer"] = "Seegson"
    
  • Синтаксис оператора plusAssign:

    arr += "manufacturer" to "Seegson"
    

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


9

hotkey
6 Мар 2017 в 13:55


«Kotlin Minimalist Tutorial» официально запущен:

Нажмите здесь>Пойдите в торговый центр Jingdong, чтобы купить и прочитать

Нажмите здесь>Пойдите в торговый центр Tmall, чтобы купить и прочитать

Спасибо большое, дорогие читатели, пожалуйста, поддержите! ! ! Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь общаться со мной ~


5.5 Map

5.5.1 Обзор карты

Карта представляет собой коллекцию, которая отображает ключевой объект Key и значение объекта Value, каждый элемент которого содержит пару ключевого объекта и объекта значения (K-V Pair). Ключ можно рассматривать как индекс значения, а объект как ключ нельзя повторить в коллекции (uniq).

Если мы посмотрим на суть структуры данных, List на самом деле является специальной картой, ключ которой является индексом типа Int. Набор также является специальной картой, ключ которой равен Int, но значение значения не может быть повторено.

Карта в Kotlin такая же, как List и Set.Карта также делится на Map только для чтения и переменную MutableMap

Карта не наследуется от интерфейса Коллекции. Структура его диаграммы классов выглядит следующим образом:

1233356-765b2cc4ab0ee015.png

Снимок экрана 2017-06-29 14.57.45.png

В интерфейсеinterface Map<K, out V>Где K — тип значения ключа, а V — тип соответствующего сопоставленного значения. здесьout VПредставляет подкласс типа V или V. Это общие знания, которые мы представим в следующей главе.

Среди нихEntry<out K, out V>На карте хранятся пары ключ-значение.

5.5.2 Создание карты

В отличие от Java, карта в Kotlin различает карту только для чтения и редактируемую карту (MutableMap, HashMap, LinkedHashMap).

Котлин не реализовал повторно набор классов коллекций, но сделал некоторые расширения на основе классов коллекций Java.

Мы знаем, что в Java, согласно различным внутренним структурам данных, интерфейс Map обычно имеет несколько классов реализации.

Среди них обычно используются:

  • HashMap

HashMap — это реализация интерфейса Map, основанная на хеш-таблице и существующая в форме ключ-значение. В HashMap ключ-значение является целым, система рассчитает место хранения значения ключа в соответствии с алгоритмом хеширования, мы можем быстро получить доступ к значению через ключ. Это позволяет нулевые значения и нулевые ключи.

Кроме того, порядок элементов в HashMap будет меняться со временем.

  • TreeMap

Реализация интерфейса Map с использованием красно-черного дерева.

  • LinkedHashMap

Существует также LinkedHashMap, который наследует HashMap и использует связанные списки. LinkedHashMap сохраняет порядок вставки записей.При переборе LinkedHashMap с помощью Iterator первая полученная запись является первой вставленной записью. Проще говоря, LinkedHashMap упорядочен и использует связанные списки для поддержания внутреннего порядка.

Когда мы используем Kotlin для создания Map, большинство из них фактически вызывают метод Java Map.

Ниже мы расскажем о создании карты и основных функциях работы.

mapOf()

Создать пустую карту только для чтения.

>>> val map1 = mapOf<String, Int>()
>>> map1.size
0
>>> map1.isEmpty()
true

Мы также можем использовать другую функцию для создания пустой карты:

>>> val map2 = emptyMap<String, Int>()
>>> map2.size
0
>>> map2.isEmpty()
true

Пустые карты все равны:

>>> map2==map1
true

Эта пустая карта доступна только для чтения, а ее свойства и возвращаемые функции предопределены. Код выглядит следующим образом:

private object EmptyMap : Map<Any?, Nothing>, Serializable {
    private const val serialVersionUID: Long = 8246714829545688274

    override fun equals(other: Any?): Boolean = other is Map<*,*> && other.isEmpty()
    override fun hashCode(): Int = 0
    override fun toString(): String = "{}"

    override val size: Int get() = 0
    override fun isEmpty(): Boolean = true

    override fun containsKey(key: Any?): Boolean = false
    override fun containsValue(value: Nothing): Boolean = false
    override fun get(key: Any?): Nothing? = null
    override val entries: Set<Map.Entry<Any?, Nothing>> get() = EmptySet
    override val keys: Set<Any?> get() = EmptySet
    override val values: Collection<Nothing> get() = EmptyList

    private fun readResolve(): Any = EmptyMap
}

mapOf(pair: Pair<K, V>): Map<K, V>

Создайте карту только для чтения, используя пару Pair.

>>> val map = mapOf(1 to "x", 2 to "y", 3 to "z")
>>> map
{1=x, 2=y, 3=z}
>>> map.get(1)
x
>>> map.get(3)
z
>>> map.size
3
>>> map.entries
[1=x, 2=y, 3=z]

Внутри этой функции создания вызывается конструктор LinkedHashMap, и связанный с ним код выглядит следующим образом:

pairs.toMap(LinkedHashMap(mapCapacity(pairs.size)))

Если мы хотим отредактировать эту карту, компилятор напрямую сообщит об ошибке

>>> map[1]="a"
error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
@InlineOnly public operator inline fun <K, V> MutableMap<Int, String>.set(key: Int, value: String): Unit defined in kotlin.collections
@InlineOnly public operator inline fun kotlin.text.StringBuilder /* = java.lang.StringBuilder */.set(index: Int, value: Char): Unit defined in kotlin.text
map[1]="a"
^
error: no set method providing array access
map[1]="a"
   ^

Потому что в неизменяемых картах функция set вообще отсутствует.

mutableMapOf()

Создайте пустую переменную Map.

>>> val map = mutableMapOf<Int, Any?>()
>>> map.isEmpty()
true
>>> map[1] = "x"
>>> map[2] = 1
>>> map
{1=x, 2=1}

Эта функция напрямую называется конструктором LinkedHashMap ().

mutableMapOf(vararg pairs: Pair<K, V>): MutableMap<K, V>

Создайте редактируемый объект MutableMap.

>>> val map = mutableMapOf(1 to "x", 2 to "y", 3 to "z")
>>> map
{1=x, 2=y, 3=z}
>>> map[1]="a"
>>> map
{1=a, 2=y, 3=z}

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

>>> val map = mutableMapOf(1 to "x", 2 to "y", 1 to "z")
>>> map
{1=z, 2=y}

назад1 to "z"Прямо поставить перед1 to "x"Накрыл.

hashMapOf(): HashMap<K, V>

Создайте объект HashMap. Котлин напрямую использует HashMap из Java.

>>> val map: HashMap<Int, String> = hashMapOf(1 to "x", 2 to "y", 3 to "z")
>>> map
{1=x, 2=y, 3=z}

linkedMapOf(): LinkedHashMap<K, V>

Создайте пустой объект LinkedHashMap. Непосредственно используется LinkedHashMap в Java.

>>> val map: LinkedHashMap<Int, String> = linkedMapOf()
>>> map
{}
>>> map[1]="x"
>>> map
{1=x}

linkedMapOf(vararg pairs: Pair<K, V>): LinkedHashMap<K, V>

Создайте объект LinkedHashMap с парой элементов Pair. Непосредственно используется LinkedHashMap в Java.

>>> val map: LinkedHashMap<Int, String> = linkedMapOf(1 to "x", 2 to "y", 3 to "z")
>>> map
{1=x, 2=y, 3=z}
>>> map[1]="a"
>>> map
{1=a, 2=y, 3=z}

sortedMapOf(vararg pairs: Pair<K, V>): SortedMap<K, V>

Создайте TreeMap, отсортированный в порядке возрастания ключа. Соответствующим является использование SortedMap в Java.

>>> val map = sortedMapOf(Pair("c", 3), Pair("b", 2), Pair("d", 1))
>>> map
{b=2, c=3, d=1}

5.5.3 Доступ к элементам карты

атрибут записей

Мы можем напрямую получить доступ к записи недвижимости

val entries: Set<Entry<K, V>>

Получить набор всех пар ключ / значение на этой карте. Тип Entry определяется следующим образом:

 public interface Entry<out K, out V> {
        public val key: K
        public val value: V
    }

Пример кода

>>> val map = mapOf("x" to 1, "y" to 2, "z" to 3)
>>> map
{x=1, y=2, z=3}
>>> map.entries
[x=1, y=2, z=3]

Таким образом, мы можем пройти этот входной набор:

>>> map.entries.forEach({println("key="+ it.key + " value=" + it.value)})
key=x value=1
key=y value=2
key=z value=3

атрибут ключа

Получите доступ к атрибуту keys:

val keys: Set<K>

Получить набор всех ключей на карте.

>>> map.keys
[x, y, z]

атрибут значений

доступval values: Collection<V>Получить коллекцию всех значений на карте. Этот набор значений может содержать повторяющиеся значения.

>>> map.values
[1, 2, 3]

атрибут размера

доступval size: IntПолучите количество пар ключ / значение карты.

>>> map.size
3

get(key: K)

Мы используем функцию get для получения значения по ключу.

operator fun get(key: K): V?

Соответствующий оператор[]

>>> map["x"]
1
>>> map.get("x")
1

Если ключ отсутствует на карте, он возвращает ноль.

>>> map["k"]
null

Если вы не хотите возвращать null, вы можете использовать функцию getOrDefault

getOrDefault(key: K, defaultValue: @UnsafeVariance V): V

Когда он равен нулю, он не возвращает ноль, но возвращает набор значений по умолчанию:

>>> map.getOrDefault("k",0)
0

Тип этого значения по умолчанию соответствует V. Несоответствие типов сообщит об ошибке:

>>> map.getOrDefault("k","a")
error: type mismatch: inferred type is String but Int was expected
map.getOrDefault("k","a")
                     ^

5.5.4 Функции оператора карты

containsKey(key: K): Boolean

Стоит ли включать ключ.

>>> val map = mapOf("x" to 1, "y" to 2, "z" to 3)
>>> map.containsKey("x")
true
>>> map.containsKey("j")
false

containsValue(value: V): Boolean

Стоит ли включать значение.

>>> val map = mapOf("x" to 1, "y" to 2, "z" to 3)
>>> map.containsValue(2)
true
>>> map.containsValue(20)
false

component1() component2()

Map.Entry<K, V>Функции оператора используются для прямого доступа к ключу и значению соответственно.

>>> val map = mapOf("x" to 1, "y" to 2, "z" to 3)
>>> map.entries.forEach({println("key="+ it.component1() + " value=" + it.component2())})
key=x value=1
key=y value=2
key=z value=3

Определения этих двух функций следующие:

@kotlin.internal.InlineOnly
public inline operator fun <K, V> Map.Entry<K, V>.component1(): K = key

@kotlin.internal.InlineOnly
public inline operator fun <K, V> Map.Entry<K, V>.component2(): V = value

Map.Entry<K, V>.toPair(): Pair<K, V>

Конвертировать карту входа в пару.

>>> map.entries
[x=1, y=2, z=3]
>>> map.entries.forEach({println(it.toPair())})
(x, 1)
(y, 2)
(z, 3)

getOrElse(key: K, defaultValue: () -> V): V

Получить значение по ключу. Если значение отсутствует, вы можете установить значение по умолчанию.

>>> val map = mutableMapOf<String, Int?>()
>>> map.getOrElse("x", { 1 })
1
>>> map["x"] = 3
>>> map.getOrElse("x", { 1 })
3

getValue(key: K): V

Если этот ключ не существует в Map, вызовите функцию get.Если вы не хотите возвращать null, выведите исключение напрямую, вы можете вызвать этот метод.

val map = mutableMapOf<String, Int?>()
>>> map.get("v")
null
>>> map.getValue("v")
java.util.NoSuchElementException: Key v is missing in the map.
    at kotlin.collections.MapsKt__MapWithDefaultKt.getOrImplicitDefaultNullable(MapWithDefault.kt:19)
    at kotlin.collections.MapsKt__MapsKt.getValue(Maps.kt:252)

getOrPut(key: K, defaultValue: () -> V): V

Если ключ не существует, добавьте его на карту, и соответствующее значение будет defaultValue.

>>> val map = mutableMapOf<String, Int?>()
>>> map.getOrPut("x", { 2 })
2
>>> map
{x=2}

iterator(): Iterator<Map.Entry<K, V>>

Что возвращает эта функцияentries.iterator(), Таким образом, мы можем использовать цикл for для обхода карты следующим образом:

>>> val map = mapOf("x" to 1, "y" to 2, "z" to 3 )
>>> for((k,v) in map){println("key=$k, value=$v")}
key=x, value=1
key=y, value=2
key=z, value=3

mapKeys(transform: (Map.Entry<K, V>) -> R): Map<R, V>

Установите Key of the Map на значение после сопоставления через функцию преобразования.

>>> val map:Map<Int,String> = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> val mmap = map.mapKeys{it.key * 10}
>>> mmap
{10=a, 20=b, 30=c, -10=z}

Обратите внимание, что это Ввод карты.
Если, к сожалению, после сопоставления любые два ключа равны, то следующие ключи будут перезаписывать предыдущие ключи.

>>> val mmap = map.mapKeys{it.key * it.key}
>>> mmap
{1=z, 4=b, 9=c}

Мы можем видеть, что1 to "a"есть-1 to "z"Накрыл.

mapValues(transform: (Map.Entry<K, V>) -> R): Map<K, R>

Соответствующая функция должна установить значение Map на новое значение после преобразования с помощью функции преобразования transform.

>>> val map:Map<Int,String> = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> val mmap = map.mapValues({it.value + "$"})
>>> mmap
{1=a$, 2=b$, 3=c$, -1=z$}

filterKeys(predicate: (K) -> Boolean): Map<K, V>

Вернуть новую Карту, составленную из элементов, которые удовлетворяют основным условиям оценки.

>>> val map:Map<Int,String> = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map.filterKeys({it>0})
{1=a, 2=b, 3=c}

Обратите внимание, что элементом it здесь является Key.

filterValues(predicate: (V) -> Boolean): Map<K, V>

Вернуть новую карту, состоящую из элементов, которые удовлетворяют условиям оценки стоимости.

>>> val map:Map<Int,String> = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map.filterValues({it>"b"})
{3=c, -1=z}

Обратите внимание, что элемент it здесь является значением.

filter(predicate: (Map.Entry<K, V>) -> Boolean): Map<K, V>

Вернуть новую Карту, состоящую из элементов, которые удовлетворяют условиям оценки вступления.

>>> val map:Map<Int,String> = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map.filter({it.key>0 && it.value > "b"})
{3=c}

Iterable<Pair<K, V>>.toMap(destination: M): M

Преобразуйте коллекцию Iterable, содержащую пару, в карту.

>>> val pairList = listOf(Pair(1,"a"),Pair(2,"b"),Pair(3,"c"))
>>> pairList
[(1, a), (2, b), (3, c)]
>>> pairList.toMap()
{1=a, 2=b, 3=c}

Map<out K, V>.toMutableMap(): MutableMap<K, V>

Преобразуйте карту только для чтения в редактируемую MutableMap.

>>> val map = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map[1]="x"
error: unresolved reference. None of the following candidates is applicable ...
error: no set method providing array access
map[1]="x"
   ^

>>> val mutableMap = map.toMutableMap()
>>> mutableMap
{1=a, 2=b, 3=c, -1=z}
>>> mutableMap[1]="x"
>>> mutableMap
{1=x, 2=b, 3=c, -1=z}

plus minus

Функции оператора добавления карты следующие:

operator fun <K, V> Map<out K, V>.plus(pair: Pair<K, V>): Map<K, V>
operator fun <K, V> Map<out K, V>.plus(pairs: Iterable<Pair<K, V>>): Map<K, V>
operator fun <K, V> Map<out K, V>.plus(pairs: Array<out Pair<K, V>>): Map<K, V>
operator fun <K, V> Map<out K, V>.plus(pairs: Sequence<Pair<K, V>>): Map<K, V>
operator fun <K, V> Map<out K, V>.plus(map: Map<out K, V>): Map<K, V>

Пример кода:

>>> val map = mapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map+Pair(10,"g")
{1=a, 2=b, 3=c, -1=z, 10=g}
>>> map + listOf(Pair(9,"s"),Pair(10,"w"))
{1=a, 2=b, 3=c, -1=z, 9=s, 10=w}
>>> map + arrayOf(Pair(9,"s"),Pair(10,"w"))
{1=a, 2=b, 3=c, -1=z, 9=s, 10=w}
>>> map + sequenceOf(Pair(9,"s"),Pair(10,"w"))
{1=a, 2=b, 3=c, -1=z, 9=s, 10=w}
>>> map + mapOf(9 to "s", 10 to "w")
{1=a, 2=b, 3=c, -1=z, 9=s, 10=w}

Добавить и назначить функции:

inline operator fun <K, V> MutableMap<in K, in V>.plusAssign(pair: Pair<K, V>)
inline operator fun <K, V> MutableMap<in K, in V>.plusAssign(pairs: Iterable<Pair<K, V>>)
inline operator fun <K, V> MutableMap<in K, in V>.plusAssign(pairs: Array<out Pair<K, V>>)
inline operator fun <K, V> MutableMap<in K, in V>.plusAssign(pairs: Sequence<Pair<K, V>>)
inline operator fun <K, V> MutableMap<in K, in V>.plusAssign(map: Map<K, V>)

Пример кода:

>>> val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map+=Pair(10,"g")
>>> map
{1=a, 2=b, 3=c, -1=z, 10=g}
>>> map += listOf(Pair(9,"s"),Pair(11,"w"))
>>> map
{1=a, 2=b, 3=c, -1=z, 10=g, 9=s, 11=w}
>>> map += mapOf(20 to "qq", 30 to "tt")
>>> map
{1=a, 2=b, 3=c, -1=z, 10=g, 9=s, 11=w, 20=qq, 30=tt}

Вычитание похоже на сложение.

put(key: K, value: V): V?

Установите значение элемента в соответствии с ключом. Если ключ существует, обновите значение, если он не существует, добавьте его, но возвращаемое значение put равно нулю.

>>> val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map
{1=a, 2=b, 3=c, -1=z}
>>> map.put(10,"q")
null
>>> map
{1=a, 2=b, 3=c, -1=z, 10=q}
>>> map.put(1,"f")
a
>>> map
{1=f, 2=b, 3=c, -1=z, 10=q}

putAll(from: Map<out K, V>): Unit

Добавить карту в MutableMap.

>>> val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> val map2 = mapOf(99 to "aa", 100 to "bb")
>>> map.putAll(map2)
>>> map
{1=a, 2=b, 3=c, -1=z, 99=aa, 100=bb}

Если есть повторяющиеся ключи, следующие значения перезапишут предыдущие значения:

>>> map
{1=a, 2=b, 3=c, -1=z, 99=aa, 100=bb}
>>> map.putAll(mapOf(1 to "www",2 to "tttt"))
>>> map
{1=www, 2=tttt, 3=c, -1=z, 99=aa, 100=bb}

MutableMap<out K, V>.remove(key: K): V?

Удалить элемент в соответствии со значением ключа.

>>> val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map.remove(-1)
z
>>> map
{1=a, 2=b, 3=c}
>>> map.remove(100)
null
>>> map
{1=a, 2=b, 3=c}

MutableMap<K, V>.clear(): Unit

Очистить MutableMap.

>>> val map = mutableMapOf(1 to "a", 2 to "b", 3 to "c", -1 to "z")
>>> map
{1=a, 2=b, 3=c, -1=z}
>>> map.clear()
>>> map
{}

Краткое содержание этой главы

В этой главе мы представим классы коллекций List, Set, Map в стандартной библиотеке Kotlin и расширенные функциональные функции, которые они расширяют. Эти функции облегчают нам использование этих классов коллекций.

Класс коллекции содержит объекты, и как правильно указать тип объекта — это то, на что мы должны обратить внимание в процессе написания кода. В следующей главе мы узнаем о дженериках.

Понравилась статья? Поделить с друзьями:
  • Error no forward proxy ports configured squid ubuntu
  • Error nonetype object is not iterable симс 4
  • Error no domain set
  • Error nonetype object has no attribute getvalidatorstatus
  • Error object reference not set to an instance of an object veeam