Spec-Zone.ru › Kotlin 1.6

Операции, специфичные для карт

В картах типы как ключей, так и значений определяются пользователем. Доступ к записям карты по ключу позволяет выполнять различные операции обработки карт, от получения значения по ключу до отдельного фильтрации ключей и значений. На этой странице мы предоставляем описания функций обработки карт из стандартной библиотеки.

Получение ключей и значений

Для получения значения из карты необходимо указать его ключ в качестве аргумента функции get(). Также поддерживается сокращенная запись [key] синтаксиса. Если заданный ключ не найден, возвращается null. Существует также функция getValue(), которая имеет немного другое поведение: она генерирует исключение, если ключ не найден в карте. Кроме того, у вас есть два дополнительных варианта обработки отсутствия ключа:

  • getOrElse() работает так же, как и для списков: значения для несуществующих ключей возвращаются из заданной лямбда-функции.

  • getOrDefault() возвращает указанное значение по умолчанию, если ключ не найден.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap.get("one"))
    println(numbersMap["one"])
    println(numbersMap.getOrDefault("four", 10))
    println(numbersMap["five"])               // null
    //numbersMap.getValue("six")      // exception!
//sampleEnd
}

Для выполнения операций со всеми ключами или со всеми значениями карты их можно получить из свойств keys и values соответственно. keys — это множество всех ключей карты, а values — коллекция всех значений карты.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap.keys)
    println(numbersMap.values)
//sampleEnd
}

Фильтрация

Вы можете отфильтровать карты с помощью функции filter(), как и другие коллекции. При вызове filter() для карты, передайте ей предикат с Pair в качестве аргумента. Это позволяет использовать как ключ, так и значение в предикате фильтрации.

fun main() {
//sampleStart
    val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
    val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10}
    println(filteredMap)
//sampleEnd
}

Также существуют два специфических способа фильтрации карт: по ключам и по значениям. Для каждого способа есть функция: filterKeys() и filterValues(). Обе возвращают новую карту записей, которые соответствуют заданному предикату. Предикат для filterKeys() проверяет только ключи элементов, предикат для filterValues() проверяет только значения.

fun main() {
//sampleStart
    val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
    val filteredKeysMap = numbersMap.filterKeys { it.endsWith("1") }
    val filteredValuesMap = numbersMap.filterValues { it < 10 }

    println(filteredKeysMap)
    println(filteredValuesMap)
//sampleEnd
}

Операторы «плюс» и «минус»

Благодаря доступу по ключу к элементам, операторы plus (+) и minus (-) работают для карт иначе, чем для других коллекций. plus возвращает Map, содержащую элементы обоих операндов: Map слева и Pair или другую Map справа. Когда операнд справа содержит записи с ключами, присутствующими в левом Map, результирующая карта содержит записи из правой части.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap + Pair("four", 4))
    println(numbersMap + Pair("one", 10))
    println(numbersMap + mapOf("five" to 5, "one" to 11))
//sampleEnd
}

minus создаёт Map из записей Map слева, за исключением тех, у которых ключи присутствуют в операнде справа. Таким образом, операнд справа может быть либо отдельным ключом, либо коллекцией ключей: списком, множеством и так далее.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap - "one")
    println(numbersMap - listOf("two", "four"))
//sampleEnd
}

Подробности использования операторов plusAssign (+=) и minusAssign (-=) для изменяемых карт см. ниже в разделе Операции записи в карты.

Операции записи в карты

Изменяемые карты предлагают специфичные для карт операции записи. Эти операции позволяют изменять содержимое карты, используя доступ к значениям по ключу.

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

  • Значения могут быть обновлены. Ключи же никогда не изменяются: после добавления записи её ключ остается постоянным.

  • Для каждого ключа всегда существует единственное связанное с ним значение. Вы можете добавлять и удалять целые записи.

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

Добавление и обновление записей

Для добавления новой пары «ключ-значение» в изменяемую карту используйте put(). При добавлении новой записи в LinkedHashMap (реализация карты по умолчанию), она добавляется так, чтобы при итерировании карта проходилась по ней последней. В отсортированных картах положение новых элементов определяется порядком их ключей.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2)
    numbersMap.put("three", 3)
    println(numbersMap)
//sampleEnd
}

Для добавления нескольких записей одновременно используйте putAll(). Её аргументом может быть Map или набор Pair: Iterable, Sequence, или Array.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
    numbersMap.putAll(setOf("four" to 4, "five" to 5))
    println(numbersMap)
//sampleEnd
}

И put(), и putAll() перезаписывают значения, если заданные ключи уже существуют в карте. Таким образом, вы можете использовать их для обновления значений записей карты.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2)
    val previousValue = numbersMap.put("one", 11)
    println("value associated with 'one', before: $previousValue, after: ${numbersMap["one"]}")
    println(numbersMap)
//sampleEnd
}

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

  • plusAssign (+=) оператор.

  • оператор [] — псевдоним оператора set().

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2)
    numbersMap["three"] = 3     // calls numbersMap.put("three", 3)
    numbersMap += mapOf("four" to 4, "five" to 5)
    println(numbersMap)
//sampleEnd
}

При вызове с ключом, присутствующим в карте, операторы перезаписывают значения соответствующих записей.

Удаление записей

Для удаления записи из изменяемой карты используйте функцию remove(). При вызове remove(), можно передать либо ключ, либо целую пару «ключ-значение». Если вы укажете и ключ, и значение, элемент с данным ключом будет удален только в случае соответствия его значения второму аргументу.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
    numbersMap.remove("one")
    println(numbersMap)
    numbersMap.remove("three", 4)            //doesn't remove anything
    println(numbersMap)
//sampleEnd
}

Также можно удалять записи из изменяемой карты по их ключам или значениям. Для этого вызовите remove() по ключам или значениям карты, указав ключ или значение записи. При вызове по значениям remove() удаляет только первую запись с заданным значением.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3)
    numbersMap.keys.remove("one")
    println(numbersMap)
    numbersMap.values.remove(3)
    println(numbersMap)
//sampleEnd
}

Оператор minusAssign (-=) также доступен для изменяемых карт.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
    numbersMap -= "two"
    println(numbersMap)
    numbersMap -= "five"             //doesn't remove anything
    println(numbersMap)
//sampleEnd
}
Последнее изменение: 07 апреля 2022 г.
Операции, специфичные для множеств Функции области видимости

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/map-operations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API