map и flatMap: преобразование каждого элемента
Преобразуйте коллекции с помощью map и объединяйте вложенные результаты с помощью flatMap.
«map и flatMap: преобразование каждого элемента» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Основы преобразований
map применяет функцию к каждому элементу и возвращает новую коллекцию того же размера. flatMap делает то же самое, но разворачивает списки списков в один список.
Базовое применение map
Преобразуйте каждый элемент с помощью лямбды; результат имеет тот же размер, что и входные данные.
fun main() {
val nums = listOf(1, 2, 3, 4)
val squares = nums.map { it * it }
println(squares) // [1, 4, 9, 16]
}map изменяет тип
Тип элементов результата может отличаться от типа входных данных: List<Int> может превратиться в List<String>.
fun main() {
val nums = listOf(1, 2, 3)
val labels = nums.map { "Item $it" }
println(labels)
}map для класса данных
Извлекайте свойство из каждого элемента, преобразуя классы данных в более простые типы.
data class User(val name: String, val age: Int)
fun main() {
val users = listOf(User("Ada", 35), User("Ben", 22))
val names = users.map { it.name }
println(names) // [Ada, Ben]
}Цепочки вызовов map
Несколько вызовов map плавно объединяются в цепочку: каждый преобразует результат предыдущего.
fun main() {
val nums = listOf(1, 2, 3)
val result = nums.map { it + 1 }.map { it * 10 }
println(result) // [20, 30, 40]
}Базовое применение flatMap
flatMap вызывает функцию, возвращающую список для каждого элемента, а затем объединяет все результаты в один список.
fun main() {
val words = listOf("hello", "world")
val chars = words.flatMap { it.toList() }
println(chars) // [h, e, l, l, o, w, o, r, l, d]
}Когда использовать flatMap
Используйте flatMap, когда лямбда естественным образом создаёт список и Вам нужен один плоский результат, а не список списков.
data class Order(val items: List<String>)
fun main() {
val orders = listOf(
Order(listOf("pen", "book")),
Order(listOf("lamp")),
Order(listOf("mug", "ring"))
)
val allItems = orders.flatMap { it.items }
println(allItems) // [pen, book, lamp, mug, ring]
}map для списка и flatMap
Сравните типы результатов: map сохраняет вложенность, а flatMap убирает её.
fun main() {
val nums = listOf(1, 2, 3)
val mapped = nums.map { listOf(it, it * 10) }
val flat = nums.flatMap { listOf(it, it * 10) }
println(mapped) // [[1, 10], [2, 20], [3, 30]]
println(flat) // [1, 10, 2, 20, 3, 30]
}flatMap с условными списками
Возвращайте пустые списки для элементов, которые нужно отбросить: flatMap одновременно фильтрует и преобразует данные.
fun main() {
val nums = listOf(1, 2, 3, 4, 5)
val doubled = nums.flatMap { if (it % 2 == 0) listOf(it, it * 2) else emptyList() }
println(doubled) // [2, 4, 4, 8]
}map с индексом
mapIndexed передаёт лямбде и индекс, и значение.
fun main() {
val fruits = listOf("apple", "banana", "cherry")
val labeled = fruits.mapIndexed { i, name -> "$i: $name" }
println(labeled)
}Последовательность и список
Для очень длинных цепочек сначала преобразуйте данные в Sequence, чтобы не создавать промежуточные списки.
fun main() {
val big = (1..100).asSequence()
.map { it + 1 }
.filter { it % 5 == 0 }
.map { it * 2 }
.toList()
println(big.take(5)) // first 5 results
}Быстрая проверка
В чём заключается главное различие между map и flatMap?
Повторение
map преобразует каждый элемент (размер сохраняется, тип может измениться). flatMap применяет функцию, возвращающую список, а затем объединяет все результаты. Используйте mapIndexed для работы с индексами, а для длинных ленивых конвейеров переключайтесь на Sequence.
Изучай Kotlin с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 51
- Уроки
- 203
Часто задаваемые вопросы
Урок «map и flatMap: преобразование каждого элемента» бесплатный?
Да — полный текст урока «map и flatMap: преобразование каждого элемента» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «map и flatMap: преобразование каждого элемента»?
Преобразуйте коллекции с помощью map и объединяйте вложенные результаты с помощью flatMap. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «map и flatMap: преобразование каждого элемента»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- map и flatMap: преобразование каждого элемента
- filter, filterNot и partition
- fold, reduce и runningFold
- Цепочки конвейеров и отказ от промежуточных списков с Sequence