fold, reduce и expand
Агрегируйте и выравнивайте итерируемые объекты
«fold, reduce и expand» — бесплатный урок Dart Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Dart Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Dart Academy содержит 4 уроков всего.
Объединение элементов коллекции
Часто требуется свести целый список к одному значению, например к сумме или максимуму. В Dart для этого есть fold и reduce. 🧮
Знакомство с reduce
reduce попарно объединяет элементы с помощью Вашей функции. Он начинает с первого элемента, поэтому список не должен быть пустым.
var sum = [1, 2, 3, 4].reduce((a, b) => a + b);
print(sum); // 10reduce накапливает результат
На каждом шаге функция получает текущий результат и следующий элемент. Считайте, что a — это накопитель, который постепенно растёт.
var max = [3, 9, 2].reduce((a, b) => a > b ? a : b);
print(max); // 9Проблема пустого списка
Вызов reduce для пустого списка вызывает StateError. Если список может оказаться пустым, используйте fold.
Знакомство с fold
fold похож на reduce, но ему передаётся начальное значение. Этот начальный элемент задаёт тип результата и безопасно обрабатывает пустые списки.
var total = [1, 2, 3].fold(0, (a, b) => a + b);
print(total); // 6fold может менять тип
Поскольку тип задаётся начальным значением, fold может превратить список значений типа int в String, Map или любой нужный Вам тип.
var joined = [1, 2, 3].fold('', (a, b) => '$a$b');
print(joined); // 123fold безопасен для пустого списка
Для пустого списка fold просто возвращает начальное значение. Никакого сбоя и никакого особого случая, который нужно помнить.
var s = <int>[].fold(0, (a, b) => a + b);
print(s); // 0reduce и fold
Используйте reduce для быстрого объединения непустого списка с сохранением типа. Выбирайте fold, когда нужно начальное значение или новый тип результата.
Знакомство с expand
expand преобразует каждый элемент в итерируемую последовательность, а затем объединяет их в один поток значений. Это сочетание map и flatten.
var r = [1, 2].expand((n) => [n, n * 10]);
print(r.toList()); // [1, 10, 2, 20]Выравнивание вложенных списков
Одна из распространённых задач для expand — превратить список списков в один плоский список одним понятным вызовом.
var flat = [[1, 2], [3, 4]].expand((x) => x);
print(flat.toList()); // [1, 2, 3, 4]Объединение трёх методов
Эти методы прекрасно сочетаются. Можно применить expand для выравнивания, а затем fold для объединения в одной понятной цепочке обработки.
var t = [[1, 2], [3]].expand((x) => x).fold(0, (a, b) => a + b);
print(t); // 6Быстрая проверка
Выберите подходящий инструмент для суммы, безопасной при пустом списке.
Итоги
reduce объединяет элементы, fold объединяет их с начальным значением, а expand выполняет выравнивание. Вместе они легко обрабатывают любую коллекцию. 🎉
Часто задаваемые вопросы
Урок «fold, reduce и expand» бесплатный?
Да — полный текст урока «fold, reduce и expand» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Dart Academy, подпишись на CoddyKit PRO. Курс Dart Academy содержит 4 уроков всего.
Чему я научусь в уроке «fold, reduce и expand»?
Агрегируйте и выравнивайте итерируемые объекты Ты практикуешь Dart Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Dart Academy?
Предыдущий опыт не требуется. Dart Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «fold, reduce и expand»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Dart Academy?
Да. Каждый урок Dart Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Функции высшего порядка и каррирование
- fold, reduce и expand
- Ленивые итерируемые объекты и генераторы с sync*
- Композиция конвейеров чистых функций