Операции, специфичные для карт
В картах типы как ключей, так и значений определяются пользователем. Доступ к записям карты по ключу позволяет выполнять различные операции, специфичные для карт, от получения значения по ключу до отдельного фильтрации ключей и значений. На этой странице мы предоставляем описания функций обработки карт из стандартной библиотеки.
Получение ключей и значений
Для получения значения из карты необходимо указать ее ключ в качестве аргумента функции 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
}
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/map-operations.html