Порядок шагов в Dart
Шаги на Iterable выполняются в том порядке,
в котором они записаны. Один и тот же набор команд
дает разный объем работы, если переставить
where и map местами.
Сначала оставим числа не меньше четырех, потом удвоим каждое:
final nums = [2, 3, 4, 5];
final viaFilter = nums
.where((n) => n >= 4)
.map((n) => n * 2)
.toList();
print(viaFilter);
Функция map сработает только для двух отобранных
значений. Если сначала удвоить каждое число, а
потом оставить результат больше шести, отбор
пойдет по другому набору промежуточных данных:
final nums = [2, 3, 4, 5];
final viaMap = nums
.map((n) => n * 2)
.where((n) => n > 6)
.toList();
print(viaMap);
Список [8, 10] совпадает с первым
вариантом, но map во втором случае
выполнился четыре раза. На длинной цепочке
такая перестановка заметно меняет объем работы.
Дан список [1, 2, 3, 4, 5].
Сначала оставьте числа больше двух, затем
прибавьте единицу и соберите список. Выведите
его и запомните длину цепочки отбора.
Для того же списка прибавьте единицу до отбора по условию больше двух. Сравните результат с предыдущей задачей и отметьте, сколько раз сработало преобразование в каждом варианте.