Saltar a contenido

1.6 Bucles: for y forEach

Un bucle repite un bloque de código. En Java hay dos formas muy usadas de recorrer valores: el for de toda la vida y el método forEach con una lambda.

Versión 1: for donde se ve de dónde sale cada cosa

public class ForSimple {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            System.out.println("Número: " + i);
        }
    }
}
Parte Qué hace
int i = 1 De dónde sale: i nace valiendo 1
i <= 5 Hasta cuándo: se repite mientras sea cierto
i++ Cómo avanza: suma 1 al terminar cada vuelta
{ ... } Lo que se repite

Versión 2: sin for completo, con forEach

Java no tiene rangos como 1..5, así que se parte de una lista:

import java.util.List;

public class ForEachSimple {
    public static void main(String[] args) {
        List<Integer> numeros = List.of(1, 2, 3, 4, 5);

        numeros.forEach(numero -> {
            System.out.println("Número actual: " + numero);
        });
    }
}

numero -> { ... } es una lambda: se ejecuta una vez por cada elemento y numero es el elemento de esa vuelta.

Con una sola línea se puede acortar usando una referencia a método:

numeros.forEach(System.out::println);

Con lógica añadida:

numeros.forEach(numero -> {
    if (numero % 2 == 0) {
        System.out.println(numero + " es par");
    } else {
        System.out.println(numero + " es impar");
    }
});

Comparación rápida

Característica for forEach
Estilo Tradicional Funcional (lambda)
break / continue ✅ Sí ❌ No (un return dentro solo salta a la siguiente vuelta)
Modificar una variable local de fuera ✅ Sí ❌ Solo si es efectivamente final
Legibilidad Muy clara en bucles simples Mejor con operaciones encadenadas

Regla práctica

Empieza con for. Usa forEach cuando solo quieras hacer algo con cada elemento y no necesites cortar el bucle.

Variantes

import java.util.List;

public class Variantes {
    public static void main(String[] args) {
        // Descendente
        for (int i = 5; i >= 1; i--) {
            System.out.println(i);
        }

        // Con paso de 2
        for (int i = 1; i <= 10; i += 2) {
            System.out.println(i);
        }

        // Sin incluir el último valor
        for (int i = 1; i < 5; i++) {
            System.out.println(i);
        }

        // for-each: recorrer una lista
        List<String> nombres = List.of("Ana", "Luis", "Eva");
        for (String nombre : nombres) {
            System.out.println(nombre);
        }

        // Recorrer con índice
        for (int i = 0; i < nombres.size(); i++) {
            System.out.println(i + ": " + nombres.get(i));
        }
    }
}

Cortar un bucle con una variable de control

Una forma sencilla de parar un bucle sin break: una variable booleana (una bandera) que el bucle consulta en su condición. Cuando pasa lo que buscas, la pones en false.

public class Bandera {
    public static void main(String[] args) {
      boolean activo = true;
      int i = 1;

      while (activo) {
        System.out.println(i);
        if (i == 5) {
          activo = false; // se cumple la condición: el bucle se detiene
        }
        i++;
      }
    }
}

Con do-while, que se ejecuta al menos una vez:

public class BanderaDoWhile {
    public static void main(String[] args) {
      boolean activo = true;
      int intentos = 0;

      do {
        intentos++;
        System.out.println("Intento " + intentos);
        if (intentos == 3) {
          activo = false;
        }
      } while (activo);
    }
}

Por qué esta forma

La condición del bucle muestra de un vistazo cuándo termina, y funciona igual en Java, Dart y Kotlin.

Opcional: break y continue

Existen, pero no son imprescindibles: casi siempre se puede escribir lo mismo con una variable de control.

Palabra Qué hace
break Sale del bucle de golpe
continue Salta a la siguiente vuelta
for (int i = 1; i <= 10; i++) {
  if (i == 3) continue; // salta esta vuelta
  if (i == 6) break;    // sale del bucle
  System.out.println(i); // 1, 2, 4, 5
}

while y do-while

int cuenta = 3;
while (cuenta > 0) {   // comprueba antes
    System.out.println(cuenta--);
}

int intentos = 0;
do {                   // se ejecuta al menos una vez
    intentos++;
} while (intentos < 3);
System.out.println(intentos); // 3