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

Какие знаешь map функции?

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

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

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

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

Map функции в Kotlin для коллекций

Map функции в Kotlin — это семейство операций высшего порядка для трансформации элементов коллекции, возвращающих новую коллекцию с преобразованными данными. Я выделю ключевые из них, объясню различия и приведу примеры.

Основные map функции

  1. map — базовая трансформация каждого элемента
val numbers = listOf(1, 2, 3)
val squared = numbers.map { it * it } // [1, 4, 9]
  1. mapIndexed — трансформация с доступом к индексу
val letters = listOf("a", "b", "c")
val indexed = letters.mapIndexed { index, value -> 
    "$index: $value" 
} // ["0: a", "1: b", "2: c"]
  1. mapNotNull и mapIndexedNotNull — фильтрация null-результатов
val mixed = listOf("1", "2", "a", "3")
val numbersOnly = mixed.mapNotNull { it.toIntOrNull() } // [1, 2, 3]

Специализированные варианты для разных коллекций

  1. mapKeys и mapValues — для работы с Map
val originalMap = mapOf(1 to "one", 2 to "two")
val keysModified = originalMap.mapKeys { it.key * 10 } // {10="one", 20="two"}
val valuesModified = originalMap.mapValues { it.value.uppercase() } // {1="ONE", 2="TWO"}
  1. flatMap — "расплющивание" вложенных структур
val lists = listOf(listOf(1, 2), listOf(3, 4))
val flattened = lists.flatMap { it } // [1, 2, 3, 4]
  1. associate, associateBy, associateWith — преобразование в Map
data class Person(val id: Int, val name: String)

val people = listOf(Person(1, "Alice"), Person(2, "Bob"))
val idToPerson = people.associateBy { it.id } // Map<Int, Person>
val personToId = people.associateWith { it.id } // Map<Person, Int>

Отличие от других операций

Важно понимать отличие map от forEach:

  • map возвращает новую коллекцию с преобразованными элементами
  • forEach выполняет действие для каждого элемента, возвращая Unit

Различие map и flatMap:

  • map сохраняет структуру: List<List> останется List<List>
  • flatMap "расплющивает" на один уровень: List<List> → List

Особенности производительности

  • Все map функции создают новую коллекцию, оригинал остается неизменным
  • Для больших коллекций используйте asSequence() для ленивых вычислений:
val result = largeList.asSequence()
    .map { heavyTransformation(it) }
    .filter { it.isValid() }
    .toList()

Продвинутые техники

  1. Кастомные map функции через extension-функции:
fun <T, R> List<T>.mapParallel(
    transform: (T) -> R
): List<R> = runBlocking {
    map { async { transform(it) } }.awaitAll()
}
  1. mapCatching (из Kotlin 1.7+) — с обработкой исключений:
val safeResults = inputs.mapCatching { 
    riskyOperation(it) 
}

Практические рекомендации

  • Используйте mapNotNull вместо map + filterNotNull
  • Для сложных преобразований комбинируйте с другими функциями: filter, groupBy
  • В Android для преобразования LiveData/Flow используйте map оператор соответствующих потоковых библиотек
  • При работе с реактивными потоками (RxJava, Flow) map работает по тому же принципу, но асинхронно

Выбор конкретной функции зависит от задачи:

  • Нужен индекс → mapIndexed
  • Работа с Map → mapKeys/mapValues
  • Нужна плоская структура → flatMap
  • Исключить null → mapNotNull
  • Преобразовать в Map → associateBy

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

Какие знаешь map функции? | PrepBro