DMarlon Studio

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.

Dart · forEach, map, where, reduce y fold en DMarlon Studio: el código del ejemplo y su salida en la terminal

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

  • forEach ejecuta una función con cada elemento.
  • map transforma; where filtra.
  • toList() convierte el resultado en una lista.
  • reduce combina todo en un valor; fold igual, 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.