Цепочки 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».
Читатель может просмотреть цепочку и понять, что происходит, не отслеживая переменные индексов.
Одно простое правило: порядок имеет значение. Фильтрация перед преобразованием выполняет меньше работы, чем преобразование перед фильтрацией, если фильтр избирательный.
Задание
СреднеПрочитайте одну строку ввода: список пар price:quantity, разделённых запятыми. Например, 3:2,5:1,2:4,7:0 означает четыре orders.
Для каждого order с quantity > 0 итоговая сумма строки равна price * quantity. Выведите три строки:
- Итоговые суммы строк (только для orders с
quantity > 0), объединённые с помощью, - Общая сумма этих итоговых сумм строк
- Количество 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, преобразовать в итоги строк; вывести объединённые, сумму, количество
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Строки в деталях
Подсчет и индексыРегистр и удаление пробеловПоиск в строкахРазделение и объединениеЗамена подстрокИтоги — Проверка имени пользователя4Множества
Создание множествОбъединение и пересечениеРазность и симметрическая разностьПодмножество и надмножествоИтоги — Фильтр тегов7Проект — Трекер привычек
Обзор проектаОтметить выполнение10Проект — Движок викторины
Обзор проектаЗадаем вопросы2Диапазоны и шаги
Закрытые и полуоткрытыеШагМетоды диапазоновДиапазоны в SwitchИтоги: Сетка календаряПотренируйтесь самостоятельно: Песочница Swift