0Pricing
Dart Academy · Урок

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); // 10

reduce накапливает результат

На каждом шаге функция получает текущий результат и следующий элемент. Считайте, что 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); // 6

fold может менять тип

Поскольку тип задаётся начальным значением, fold может превратить список значений типа int в String, Map или любой нужный Вам тип.

var joined = [1, 2, 3].fold('', (a, b) => '$a$b');
print(joined); // 123

fold безопасен для пустого списка

Для пустого списка fold просто возвращает начальное значение. Никакого сбоя и никакого особого случая, который нужно помнить.

var s = <int>[].fold(0, (a, b) => a + b);
print(s); // 0

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

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

  1. Функции высшего порядка и каррирование
  2. fold, reduce и expand
  3. Ленивые итерируемые объекты и генераторы с sync*
  4. Композиция конвейеров чистых функций
← Назад к Dart Academy