2 minutos

Bucle For en Java

1. Introducción

En este artículo, examinaremos un aspecto fundamental del lenguaje Java: ejecutar una declaración o un grupo de declaraciones repetidamente utilizando un bucle for.

2. Bucle For Simple

Un bucle for es una estructura de control que nos permite repetir ciertas operaciones al incrementar y evaluar un contador de bucle.

Antes de la primera iteración, el contador de bucle se inicializa, luego se realiza la evaluación de la condición, seguida de la definición del paso (generalmente una simple incrementación).

La sintaxis del bucle for es la siguiente:

for (inicialización; expresión-booleana; paso) 
  declaración;

Veámoslo en un ejemplo sencillo:

for (int i = 0; i < 5; i++) {
    System.out.println("Bucle for simple: i = " + i);
}

La inicialización, la expresión booleana y el paso utilizados en las declaraciones for son opcionales. Aquí tienes un ejemplo de un bucle for infinito:

for ( ; ; ) {
    // Bucle for infinito
}

2.1. Bucles For Etiquetados

También podemos tener bucles for etiquetados. Es útil si tenemos bucles for anidados para que podamos hacer break o continue desde un bucle for específico:

aa: for (int i = 1; i <= 3; i++) {
    if (i == 1)
      continue;
    bb: for (int j = 1; j <= 3; j++) {
        if (i == 2 && j == 2) {
            break aa;
        }
        System.out.println(i + " " + j);
    }
}

3. Bucle For Mejorado

Desde Java 5, tenemos un segundo tipo de bucle for llamado el bucle for mejorado, que facilita la iteración sobre todos los elementos en un array o una colección.

La sintaxis del bucle for mejorado es la siguiente:

for (Tipo elemento : elementos)
  declaración;

Dado que este bucle es más sencillo en comparación con el bucle for estándar, solo necesitamos declarar dos cosas al inicializar un bucle:

  1. El identificador para un elemento que estamos iterando actualmente.
  2. La array/colección por la que estamos iterando.

Por lo tanto, podemos decir que: Por cada valor en elementos, asigna el valor a la variable elemento y ejecuta el cuerpo del bucle.

Echemos un vistazo al ejemplo sencillo:

int[] numeros = { 0, 1, 2, 3, 4 }; 
for (int numero : numeros) {
    System.out.println("Bucle for mejorado: i = " + numero);
}

Podemos usarlo para iterar sobre varias estructuras de datos de Java:

Dada un objeto List<String> lista, podemos iterarlo así:

for (String elemento : lista) {
    System.out.println(elemento);
}

Podemos iterar de manera similar sobre un conjunto Set<String>:

for (String elemento : conjunto) {
    System.out.println(elemento);
}

Y, dado un mapa Map<String,Integer>, también podemos iterarlo:

for (Entry<String, Integer> entrada : mapa.entrySet()) {
    System.out.println(
      "Clave: " + entrada.getKey() + 
      " - " + 
      "Valor: " + entrada.getValue());
}

3.1. Iterable.forEach()

Desde Java 8, podemos aprovechar los bucles for-each de una manera ligeramente diferente. Ahora tenemos un método forEach() dedicado en la interfaz Iterable que acepta una expresión lambda que representa una acción que queremos realizar.

Internamente, simplemente delega el trabajo al bucle estándar:

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

Echemos un vistazo al ejemplo:

List<String> nombres = new ArrayList<>();
nombres.add("Larry");
nombres.add("Steve");
nombres.add("James");
nombres.add("Conan");
nombres.add("Ellen");

nombres.forEach(nombre -> System.out.println(nombre));

4. Conclusión

En este breve tutorial, exploramos el bucle for de Java.