← Назад к вопросам
Какие знаешь map функции?
1.0 Junior🔥 302 комментариев
#Kotlin основы#Коллекции и структуры данных
Комментарии (2)
🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Map функции в Kotlin для коллекций
Map функции в Kotlin — это семейство операций высшего порядка для трансформации элементов коллекции, возвращающих новую коллекцию с преобразованными данными. Я выделю ключевые из них, объясню различия и приведу примеры.
Основные map функции
map— базовая трансформация каждого элемента
val numbers = listOf(1, 2, 3)
val squared = numbers.map { it * it } // [1, 4, 9]
mapIndexed— трансформация с доступом к индексу
val letters = listOf("a", "b", "c")
val indexed = letters.mapIndexed { index, value ->
"$index: $value"
} // ["0: a", "1: b", "2: c"]
mapNotNullиmapIndexedNotNull— фильтрация null-результатов
val mixed = listOf("1", "2", "a", "3")
val numbersOnly = mixed.mapNotNull { it.toIntOrNull() } // [1, 2, 3]
Специализированные варианты для разных коллекций
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"}
flatMap— "расплющивание" вложенных структур
val lists = listOf(listOf(1, 2), listOf(3, 4))
val flattened = lists.flatMap { it } // [1, 2, 3, 4]
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()
Продвинутые техники
- Кастомные map функции через extension-функции:
fun <T, R> List<T>.mapParallel(
transform: (T) -> R
): List<R> = runBlocking {
map { async { transform(it) } }.awaitAll()
}
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 и позволяют писать выразительный, безопасный и поддерживаемый код для обработки коллекций.