Ciclos for, for-in y forEach en Dart

Clase 14 de 29Curso de Dart

Resumen

Dominar las estructuras de repetición es fundamental para escribir código eficiente en Dart. El ciclo for ofrece tres variantes que se adaptan a diferentes necesidades: el for tradicional, el for-in y el forEach. Cada uno tiene ventajas claras dependiendo del contexto, y conocerlos todos permite elegir la mejor opción en cada situación.

¿Cómo funciona el for tradicional en Dart?

El for tradicional mantiene la estructura clásica presente en muchos lenguajes de programación. Se compone de tres partes dentro del paréntesis: el inicializador, la condición y el incremento o decremento [0:38].

dart for (int i = 0; i <= 10; i++) { print('Valor incrementado: $i'); }

En este ejemplo, int i = 0 es el inicializador que define desde dónde comienza el conteo. La condición i <= 10 indica que el ciclo se ejecutará mientras i sea menor o igual a 10. Finalmente, i++ incrementa el valor en cada iteración.

¿Cómo tomar decisiones dentro de un ciclo for?

Dentro del ciclo es posible agregar condicionales para filtrar resultados. Por ejemplo, si solo se necesitan los números pares, se utiliza la propiedad .isEven [1:36]:

dart for (int i = 0; i <= 10; i++) { if (i.isEven) { print(i); } }

El resultado será: 0, 2, 4, 6, 8, 10. Aunque el ciclo recorre las 10 iteraciones completas, la decisión interna con el if filtra únicamente los valores que cumplen la condición.

¿Qué ventaja ofrece el for-in sobre el for tradicional?

Cuando se trabaja con listas, el for-in simplifica considerablemente el código. No es necesario definir un inicializador, una condición ni conocer la longitud de la lista [2:15].

dart List<String> list = ['rojo', 'verde', 'rosa'];

for (String color in list) { print(color); }

Cada elemento de la lista se asigna automáticamente a la variable color en cada iteración. El resultado imprime: rojo, verde, rosa.

Para lograr lo mismo con un for tradicional, se necesita acceder a la propiedad .length de la lista y usar el índice para obtener cada elemento [2:49]:

dart for (int i = 0; i <= list.length - 1; i++) { print(list[i]); }

Un detalle importante: las posiciones en una lista comienzan desde cero. Si la lista tiene tres elementos, las posiciones válidas son 0, 1 y 2. Usar list.length sin restar uno provoca un error de tipo RangeError, porque la posición 3 no existe [3:08].

¿Cómo se usa forEach en las listas de Dart?

El método forEach es una propiedad que pertenece directamente a las listas, los sets y los maps. No requiere un ciclo externo, sino que se invoca sobre la propia colección [3:40].

Se puede escribir de dos formas. La primera usa un fat arrow para expresiones de una sola línea:

dart list.forEach((color) => print(color));

La segunda utiliza una función anónima con llaves, lo cual permite incluir más de una instrucción [4:05]:

dart list.forEach((color) { print(color); });

Ambas producen el mismo resultado: rojo, verde, rosa. La diferencia está en la flexibilidad: el fat arrow es ideal para operaciones simples, mientras que la función anónima permite lógica más compleja.

¿Cuándo elegir cada tipo de for en Dart?

La elección depende del escenario:

  • For tradicional: útil cuando se necesita control preciso del índice, incrementar o decrementar valores, o aplicar condiciones numéricas.
  • For-in: ideal para recorrer colecciones de forma limpia sin preocuparse por índices ni longitudes.
  • forEach: perfecto cuando se quiere operar directamente sobre cada elemento de una colección sin declarar un ciclo externo.

Explorar las propiedades disponibles en las listas, los sets y los maps permite encontrar métodos como forEach que simplifican el código. ¿Ya habías probado estas tres variantes en tus proyectos con Dart? Comparte tu experiencia en los comentarios.