Menu
Coddy logo textTech

Цепочки map, filter, reduce

Часть раздела Логика и управление потоком путешествия по Swift на Coddy. Урок 26 из 56.

Настоящая сила этих трёх методов в том, что они могут составляться в цепочку. Каждый шаг преобразует данные и передаёт их следующему.

let nums = [1, 2, 3, 4, 5, 6]
let result = nums
    .filter { $0 % 2 == 0 }      // [2, 4, 6]
    .map { $0 * $0 }             // [4, 16, 36]
    .reduce(0, +)                // 56
print(result)                    // 56

Чтение сверху вниз: оставить чётные числа, возвести их в квадрат, сложить квадраты. Каждый шаг выполняет одно очевидное действие, и цепочка остаётся понятной, даже когда становится длиннее.

Эта форма конвейера заменяет написанный вручную цикл явным намерением. filter означает «select». map означает «transform». reduce означает «collapse».

Читатель может просмотреть цепочку и понять, что происходит, не отслеживая переменные индексов.

Одно простое правило: порядок имеет значение. Фильтрация перед преобразованием выполняет меньше работы, чем преобразование перед фильтрацией, если фильтр избирательный.

challenge icon

Задание

Средне

Прочитайте одну строку ввода: список пар price:quantity, разделённых запятыми. Например, 3:2,5:1,2:4,7:0 означает четыре orders.

Для каждого order с quantity > 0 итоговая сумма строки равна price * quantity. Выведите три строки:

  1. Итоговые суммы строк (только для orders с quantity > 0), объединённые с помощью ,
  2. Общая сумма этих итоговых сумм строк
  3. Количество orders, которые внесли вклад (то есть quantity больше нуля)

Постройте конвейер с помощью filter, за которым следует map, затем получите count и sum из result.

Для ввода 3:2,5:1,2:4,7:0 вывод будет таким:

6,5,8
19
3

Попробуйте сами

let orders = readLine()!.components(separatedBy: ",").map { pair -> (Int, Int) in
    let parts = pair.components(separatedBy: ":")
    return (Int(parts[0])!, Int(parts[1])!)
}

// TODO: отфильтровать quantity > 0, преобразовать в итоги строк; вывести объединённые, сумму, количество
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Песочница Swift