CodeGym/Blog Java/Random-ES/Bucle for-each en Java
Autor
Artem Divertitto
Senior Android Developer at United Tech

Bucle for-each en Java

Publicado en el grupo Random-ES

¿Qué es un bucle for-each?

Un for-each es una especie de bucle for que utiliza cuando necesita procesar todos los elementos de una matriz o colección. Dicho esto, la frase for-each en realidad no se usa en este bucle. Su sintaxis es la siguiente:
for (type itVar : array)
{
    // Operations
}
Donde tipo es el tipo de la variable iteradora (¡que coincide con el tipo de datos de los elementos en la matriz!), itVar es su nombre y matriz es una matriz (también se permiten otras estructuras de datos, por ejemplo, algún tipo de colección, como ArrayList ), es decir, el objeto sobre el que se ejecuta el bucle. Como puede ver, esta construcción no usa un contador: la variable iteradora simplemente itera sobre los elementos de la matriz o colección. Cuando se ejecuta un bucle de este tipo, a la variable del iterador se le asigna secuencialmente el valor de cada elemento de la matriz o colección, después de lo cual se ejecuta el bloque de declaraciones (o declaración) especificado.

Además del bucle for-each, Java también tiene un método forEach(). Puedes leer sobre esto en el artículo titulado "¡Deja de escribir bucles!" Las 10 mejores prácticas para trabajar con colecciones en Java 8

Nota:se puede aplicar un bucle for-each a matrices y cualquier clase que implemente la interfaz java.lang.Iterable . El siguiente bucle for sería equivalente al código anterior:
for (int i=0; i < array.length; i++)
{

    // Statements
}

Ejemplo de un bucle for-each

Creamos una matriz de puntajes de los estudiantes. Luego usamos un ciclo for-each para imprimir todas las estimaciones, calcular el puntaje promedio y encontrar el puntaje máximo.
public class ForEachTest {

// A method that prints all scores
public static void printAllScores(int[] scores) {
        System.out.print("|");
        for (int num : scores) {

            System.out.print(num + "|");
        }
        System.out.println();
    }

// A method that displays the average score

public static double getAverageScore(int[] numbers) {
        int totalScore = 0;

        for (int num : numbers) {
            totalScore = num + totalScore;
        }
        return ((double) totalScore / numbers.length);

    }
// A method that determines the best (maximum) score
    public static int getBestScore(int[] numbers) {
        int maxScore = numbers[0];

        for (int num : numbers) {
            if (num > maxScore) {
                maxScore = num;
            }
        }
        return maxScore;
    }

public static void main(String[] args) {

// Array of scores
int[] scores = {5, 10, 7, 8, 9, 9, 10, 12};


  int bestScore = getBestScore(scores);
        System.out.print("All the scores: ");
        printAllScores(scores);
        System.out.println("The highest score is " + bestScore);
        System.out.println("The average score is " + getAverageScore(scores));
    }

}
Salida del programa:
All the scores: |5|10|7|8|9|9|10|12|
The highest score is 12
The average score is 8.75
Ahora, veamos cómo se vería un método para imprimir todas las partituras si usáramos un ciclo for ordinario:
public static void printAllScores(int[] scores) {
        System.out.print("|");
        for (int i = 0; i < scores.length; i++) {

            System.out.print(scores[i] + "|");
        }
        System.out.println();
    }
Si llamamos a este método desde el método principal , obtenemos este resultado:
All the scores: |5|10|7|8|9|9|10|12|

Ejemplo de un bucle for-each con colecciones

Creamos una colección de nombres y mostramos todos los nombres en la pantalla.
List<String> names = new ArrayList<>();
        names.add("Snoopy");
        names.add("Charlie");
        names.add("Linus");
        names.add("Shroeder");
        names.add("Woodstock");

        for(String name : names){
            System.out.println(name);
        }

Limitaciones de un bucle for-each

La forma compacta del bucle for-each se considera más fácil de leer que un bucle for , y se considera una buena práctica usar un bucle for-each siempre que sea posible. Sin embargo, un bucle for-each es una construcción menos universal que un bucle for ordinario . Aquí hay algunos casos simples en los que un ciclo for-each no funcionará en absoluto o funcionará, pero solo con dificultad.
  1. Si desea ejecutar un bucle desde el final hasta el principio. Es decir, no hay un bucle for-each que sea un análogo directo del siguiente código:

    for (int i= array.length-1; i>0; i--)
    {
          System.out.println(array[i]);
    }
  2. For-each no es adecuado si desea realizar cambios en una matriz. Por ejemplo, no puede ordenar una matriz sin cambiar la ubicación de sus elementos. Además, en el siguiente código, solo cambiará la variable del iterador, no el elemento de la matriz:

    for (int itVar : array)
    {
        itVar = itVar++;
    }
  3. Si está buscando un elemento en una matriz y necesita devolver (o pasar) el índice del elemento que está buscando, entonces es mejor usar un bucle for ordinario .

Un video útil sobre el ciclo for-each

Bucles en el curso de CodeGym

En CodeGym, comenzamos a practicar el uso de bucles en el nivel 4 de la búsqueda de sintaxis de Java . Varias de las lecciones de ese nivel, así como muchas de las tareas de varios niveles, están dedicadas a los bucles para reforzar sus habilidades al trabajar con ellos. Básicamente, no hay forma de escapar de ellos: los bucles son una de las construcciones más importantes en la programación.

Más información sobre for-each y otros bucles

  1. La sentencia while . El artículo trata sobre el tipo de ciclo más simple: el whileciclo, que CodeGym usa para presentar los ciclos a los estudiantes.
  2. ¡Deja de escribir bucles! Las 10 mejores prácticas para trabajar con colecciones en Java 8 . Este artículo ayudará a los estudiantes de CodeGym que están al menos a la mitad del curso a aprender muchas cosas interesantes sobre el trabajo con colecciones.
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios