Какие функции высшего порядка ты знаешь и чем отличаются map, compactMap и flatMap?

Функции высшего порядка: сравнение map, compactMap и flatMap Функции высшего порядка — это функции, которые получают другие функции в аргументах либо возвращают функцию map применяет преобразование к каждому элементу…

Короткий ответ

Что ответить на собеседовании

Функции высшего порядка: сравнение map, compactMap и flatMap Функции высшего порядка — это функции, которые получают другие функции в аргументах либо возвращают функцию map применяет преобразование к каждому элементу коллекции и возвращает коллекцию с тем же количеством элементов compactMap работает подобно map, однако исключает значения nil (опционалы), поэтому итоговая коллекция не содержит nil flatMap преобразует элементы по принципу map, а затем разворачивает вложенные коллекции, формируя плоскую структуру В Swift назначение flatMap и compactMap различается: flatMap объединяет вложенные массивы, тогда как compactMap удаляет nil из…

Подробный разбор

Ответ с пояснениями

Функции высшего порядка: сравнение map, compactMap и flatMap

  • Функции высшего порядка — это функции, которые получают другие функции в аргументах либо возвращают функцию
  • map применяет преобразование к каждому элементу коллекции и возвращает коллекцию с тем же количеством элементов
  • compactMap работает подобно map, однако исключает значения nil (опционалы), поэтому итоговая коллекция не содержит nil
  • flatMap преобразует элементы по принципу map, а затем разворачивает вложенные коллекции, формируя плоскую структуру
  • В Swift назначение flatMap и compactMap различается: flatMap объединяет вложенные массивы, тогда как compactMap удаляет nil из результатов
  • Эти функции позволяют чисто и декларативно обходить и преобразовывать коллекции, одновременно выполняя фильтрацию и "развёртывание"
  • Например, [1, 2, nil, 4].compactMap { $0 } исключит nil, а [[1,2],[3,4]].flatMap { $0 } преобразует в [1,2,3,4]
  • Функцию выбирают по задаче: обычное преобразование выполняет map, обработку опционалов — compactMap, а работу с вложенными коллекциями — flatMap

Такой ответ демонстрирует понимание функций высшего порядка, их семантики и практических различий между ними, включая характерные примеры.

Подробный ответ

Основной ответ

Функции высшего порядка — это функции, способные принимать другие функции в качестве аргументов или возвращать функции. В Swift, как и во многих других языках, map, compactMap и flatMap регулярно применяются при работе с коллекциями и опциональными значениями.

  • map выполняет переданную операцию для каждого элемента коллекции и формирует массив результатов, не меняя число элементов. Например, преобразование [1, 2, 3].map { $0 * 2 } даст [2, 4, 6].
  • compactMap повторяет общий принцип map, но удаляет из результата все элементы, для которых функция вернула nil. Таким образом, он одновременно выполняет преобразование и фильтрацию. Например, преобразование ["1", "a", "3"].compactMap { Int($0) } даст [1, 3].
  • flatMap объединяет результаты применения функции к элементам коллекции в единый плоский массив, «разворачивая» вложенные коллекции. Кроме того, в Swift flatMap для Optional способен «распаковывать» вложенные опционалы.

Ключевые моменты

  • map – изменяет значения элементов, не затрагивая структуру коллекции, поэтому подходит для неглубоких преобразований.
  • compactMap – удаляет nil и удобен, когда опциональные значения нужно преобразовать в массив без пустых элементов.
  • flatMap – устраняет вложенность коллекций и объединяет массивы на одном уровне; он также работает с вложенными Optional (deprecated для Optional в Swift 5.1+, рекомендуется использовать compactMap).
  • Начиная со Swift 5.1+ для преобразования Optional → Non-Optional следует предпочитать compactMap, поскольку flatMap для Optional считается устаревшим.

Практический контекст

В JSON-парсинге compactMap позволяет убрать невалидные значения, map подходит для простых преобразований, а flatMap — для объединения результатов вложенных массивов, например для сбора всех тегов разных объектов в один массив. В React и JavaScript эти функции имеют похожую семантику, что отражает их универсальность в функциональном программировании.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку