Iteración
for clásico, for-each y while
for clásico
El for de tres partes (inicialización; condición; actualización). Útil cuando necesitas el índice,
recorrer en sentido inverso, o incrementar de forma no lineal.
// for clásico: cuando necesitas el índice o control preciso del contador
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
// Recorrer array con índice
int[] numeros = {10, 20, 30, 40};
for (int i = 0; i < numeros.length; i++) {
System.out.println("numeros[" + i + "] = " + numeros[i]);
}
// Puede ser cualquier expresión de control
for (int i = numeros.length - 1; i >= 0; i--) { // recorrido inverso
System.out.println(numeros[i]);
} for-each (enhanced for)
Sintaxis más legible para recorrer cualquier Iterable (incluyendo todas las colecciones) o array.
Preferible al for clásico siempre que no se necesite el índice ni modificar la estructura.
// for-each (enhanced for): para cualquier Iterable o array
// Más legible que el for clásico cuando no necesitas el índice
List<String> nombres = Arrays.asList("Ana", "Luis", "Eva");
for (String nombre : nombres) {
System.out.println(nombre);
}
// También funciona con arrays
for (int n : numeros) {
System.out.println(n);
}
// Limitación: no permite modificar la colección durante la iteración
// ni obtener el índice directamente while y do-while
while evalúa la condición antes de ejecutar el cuerpo: puede no ejecutarse nunca. do-while ejecuta el cuerpo al menos una vez, luego evalúa la condición. Se usan cuando el número de iteraciones depende
de una condición externa, no de un contador.
// while: cuando no se sabe de antemano cuántas iteraciones habrá
Scanner sc = new Scanner(System.in);
String entrada = "";
while (!entrada.equals("salir")) {
System.out.print("Escribe algo ('salir' para terminar): ");
entrada = sc.nextLine();
System.out.println("Escribiste: " + entrada);
}
// do-while: ejecuta al menos una vez antes de comprobar la condición
int intentos = 0;
do {
intentos++;
System.out.println("Intento " + intentos);
} while (intentos < 3); break y continue
// break: sale del bucle inmediatamente
// continue: salta a la siguiente iteración
List<Integer> valores = Arrays.asList(1, 3, -5, 7, 2, -1, 8);
// Encontrar el primer negativo
for (int v : valores) {
if (v < 0) {
System.out.println("Primer negativo: " + v);
break; // sale del bucle
}
}
// Saltar negativos
for (int v : valores) {
if (v < 0) continue; // salta al siguiente elemento
System.out.println(v); // solo imprime los positivos
}
// break con label: para salir de bucles anidados (uso raro)
externo:
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i * j > 6) break externo; // sale de ambos bucles
}
}