Kotlin Academy · Урок

map и flatMap: преобразование каждого элемента

Преобразуйте коллекции с помощью map и объединяйте вложенные результаты с помощью flatMap.

Урок 1 из 413 шагов

«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 — локальная установка не требуется.

Все уроки этого курса

  1. map и flatMap: преобразование каждого элемента
  2. filter, filterNot и partition
  3. fold, reduce и runningFold
  4. Цепочки конвейеров и отказ от промежуточных списков с Sequence
← Назад к Kotlin Academy