← Назад к вопросам

Как создать коллекцию ключ-значение в Kotlin?

1.2 Junior🔥 241 комментариев
#Kotlin основы#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Создание коллекций «ключ-значение» в Kotlin

В Kotlin для работы с коллекциями типа «ключ-значение» (ассоциативными массивами) преимущественно используются Map и MutableMap. Эти интерфейсы предоставляют гибкие и безопасные способы хранения пар данных, причём ключи уникальны в рамках одной коллекции, а значения могут дублироваться.

Основные способы создания Map

1. Использование функций-конструкторов mapOf() и mutableMapOf()

Самый распространённый способ создания неизменяемой (read-only) и изменяемой (mutable) карты соответственно:

// Неизменяемая Map (только для чтения)
val immutableMap = mapOf(
    "name" to "Иван",
    "age" to 30,
    "city" to "Москва"
)

// Изменяемая MutableMap
val mutableMap = mutableMapOf(
    1 to "Январь",
    2 to "Февраль",
    3 to "Март"
)

// Добавление элемента в изменяемую карту
mutableMap[4] = "Апрель"

2. Создание пустой карты

Когда нужно инициализировать пустую коллекцию с последующим заполнением:

val emptyMap = emptyMap<String, Int>() // Неизменяемая пустая карта
val emptyMutableMap = mutableMapOf<String, Double>() // Изменяемая пустая карта
val anotherEmptyMap = mapOf<String, Any>() // Альтернативный способ

3. Использование конструктора HashMap, LinkedHashMap, TreeMap

Для конкретных реализаций с определёнными характеристиками производительности:

// HashMap - не гарантирует порядок элементов
val hashMap = HashMap<String, Int>()
hashMap["ключ1"] = 100
hashMap["ключ2"] = 200

// LinkedHashMap - сохраняет порядок добавления элементов
val linkedMap = LinkedHashMap<Int, String>()
linkedMap[1] = "Первый"
linkedMap[3] = "Третий"

// TreeMap - сортирует элементы по ключам (ключи должны реализовывать Comparable)
val treeMap = TreeMap<String, Int>()
treeMap["zebra"] = 1
treeMap["apple"] = 2 // Автоматически отсортирует по алфавиту

4. Функциональные методы создания

Kotlin предоставляет элегантные функциональные подходы:

// Создание через associate/associateWith/associateBy
val list = listOf("a", "b", "c")

// associate - преобразование списка в пары ключ-значение
val map1 = list.associate { it to it.uppercase() }

// associateWith - ключи из коллекции, значения через функцию
val map2 = list.associateWith { it.length }

// associateBy - значения из коллекции, ключи через функцию
val map3 = list.associateBy { it.uppercase() }

// Создание с помощью buildMap (Kotlin 1.3+)
val builtMap = buildMap {
    put("id", 123)
    put("title", "Kotlin Guide")
    putAll(mapOf("author" to "JetBrains", "year" to 2024))
}

Важные особенности и рекомендации

  • Тип выводится автоматически: Компилятор Kotlin обычно определяет типы ключей и значений на основе переданных аргументов
  • Иммутабельность по умолчанию: mapOf() создаёт неизменяемую коллекцию — следуйте принципам иммутабельного программирования
  • Расширенные возможности: Все реализации Map в Kotlin имеют богатый набор функций-расширений: filterKeys(), mapValues(), getOrElse() и др.
  • Null-безопасность: Для работы с возможными отсутствующими ключами используйте getValue() с исключением, getOrElse() или оператор безопасного вызова ?.
// Безопасная работа с Map
val ages = mapOf("Анна" to 25, "Пётр" to 30)

val annaAge = ages["Анна"] // 25 (тип Int?)
val unknownAge = ages["Максим"] // null

// Рекомендуемые подходы
val safeAge1 = ages.getOrDefault("Максим", 0) // 0
val safeAge2 = ages.getOrElse("Максим") { 0 } // 0 через лямбду

Практический пример использования

fun main() {
    // Создание и инициализация
    val userSettings = mutableMapOf(
        "theme" to "dark",
        "language" to "ru",
        "notifications" to true
    )
    
    // Модификация
    userSettings["fontSize"] = 14
    userSettings.remove("notifications")
    
    // Итерация
    for ((key, value) in userSettings) {
        println("$key: $value")
    }
    
    // Функциональная обработка
    val stringRepresentation = userSettings
        .filter { (key, _) -> key != "theme" }
        .map { (key, value) -> "$key=$value" }
        .joinToString()
    
    println(stringRepresentation)
}

Выбор конкретного способа создания зависит от требований к коллекции: нужна ли изменяемость, важен ли порядок элементов, требуются ли специальные характеристики производительности для конкретных операций. Для большинства повседневных задач достаточно mapOf() и mutableMapOf(), которые обеспечивают читаемость кода и типобезопасность.