Lección 17 · 17 de 20
forEach, map, where, reduce y fold · Dart
Recorra y transforme colecciones en Dart con forEach, map, where, reduce y fold, y encadénelos para filtrar, convertir y sumar en una línea.

Estos métodos reciben una función anónima (lección 13) y la aplican a cada elemento. `forEach` simplemente la ejecuta con cada uno: names.forEach((name) => print('Welcome, $name')) saluda a los tres.
`map` convierte cada elemento en otro: cada pedido pasa a ser un texto como 24.00 EUR. `where` se queda solo con los elementos que cumplen la condición, aquí los pedidos de 20 euros o más. Los dos dan una secuencia, que `toList()` convierte en lista.
`reduce` combina los elementos de dos en dos hasta dejar uno solo: con (a, b) => a + b va sumando y da el total, 155.75, y con (a, b) => a > b ? a : b se queda en cada paso con el mayor, 61.0.
`fold` es como reduce, pero empieza desde un valor inicial, que además puede ser de otro tipo: fold(0, ...) cuenta los pedidos pequeños empezando en 0, y fold('', ...) construye una cadena con las iniciales de una lista de nombres.
Como cada método devuelve una colección, se pueden encadenar: el último ejemplo filtra los pedidos de más de 10 euros con where, convierte cada uno en puntos con map y ~/ y los suma con fold. Se lee de arriba abajo, como una receta.
Código · main.dart
void main() { var names = ['Ana', 'Ben', 'Carla']; var orders = [24.0, 8.5, 61.0, 15.25, 42.0, 5.0]; // forEach runs a function with each element. names.forEach((name) => print('Welcome, $name')); // map turns each element into another; toList makes a list. var labels = orders.map((o) => '${o.toStringAsFixed(2)} EUR').toList(); print('Labels: $labels'); // where keeps only the elements that meet the condition. var big = orders.where((o) => o >= 20).toList(); print('Orders of 20 or more: $big'); // reduce combines the elements two by two into one. var total = orders.reduce((a, b) => a + b); var highest = orders.reduce((a, b) => a > b ? a : b); print('Total: $total, highest: $highest'); // fold is like reduce, but starts from a value of any type. var small = orders.fold(0, (count, o) => o < 10 ? count + 1 : count); var initials = names.fold('', (text, name) => text + name[0]); print('Small orders: $small, initials: $initials'); // They chain: filter, transform and add up in one go. var points = orders .where((o) => o > 10) .map((o) => o ~/ 10) .fold(0, (sum, p) => sum + p); print('Loyalty points: $points');}Salida · dart run main.dart
Welcome, Ana Welcome, Ben Welcome, Carla Labels: [24.00 EUR, 8.50 EUR, 61.00 EUR, 15.25 EUR, 42.00 EUR, 5.00 EUR] Orders of 20 or more: [24.0, 61.0, 42.0] Total: 155.75, highest: 61.0 Small orders: 2, initials: ABC Loyalty points: 13
Para recordar
forEachejecuta una función con cada elemento.maptransforma;wherefiltra.toList()convierte el resultado en una lista.reducecombina todo en un valor;foldigual, desde un valor inicial.- Los métodos se encadenan:
where(...).map(...).fold(...).
Ejercicio
Con una lista de edades, use where para quedarse con los mayores de edad, map para convertirlas en textos 'X years', y fold para calcular la suma de todas las edades.