Bucle For mejorado (bucle For-Each) en Java
Hay cuatro tipos de bucles en Java: for-loop, para cada ciclo, bucle while y bucle do-while. Esta publicación proporciona una descripción general de la construcción for-each en Java.
los foreach-construcción es una declaración de flujo de control introducida en Java 1.5, lo que facilita la iteración de elementos en una array o una colección. El bucle For-Each generalmente se usa como un sustituto de la instrucción for estándar cuando no se necesita realmente un contador de bucle y cada elemento de la colección debe procesarse. También se conoce como el bucle for mejorado, el bucle For-Each y el ForEach
declaración.
La sintaxis del bucle for mejorado es:
1 2 3 |
for (Type item: iterableCollection) { // Hacer algo con el elemento } |
El bucle anterior se lee como "para cada elemento de tipo en iterableCollection", donde los dos puntos (:) significan en.
Nótese la diferencia entre el bucle for estándar y para cada bucle. La sintaxis está muy simplificada y el ciclo no mantiene un contador explícito: esencialmente dicen "haz esto con todo en esta colección", en lugar de "haz esto x
veces".
¿Necesita un bucle for mejorado?
Considere el siguiente código, que usa un iterador para recorrer una colección.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; class Main { public static void main(String[] args) { List<String> colors = new ArrayList<>(Arrays.asList("Blue", "Red", "Green")); // recorriendo la lista usando un iterador for (Iterator<String> itr = colors.iterator(); itr.hasNext(); ) { System.out.println(itr.next()); } } } |
Resultado:
Blue
Red
Green
El código anterior usa un iterador para recorrer la lista, que es simplemente fea y difícil de leer. Además, tiene un gran potencial de errores ya que utiliza genéricos y se accede a la variable iterador varias veces en el código. La construcción for-each simplifica el código al ocultar la complejidad detrás de escena. (ForEach internamente invoca el iterator()
método). Además, el propio compilador se ocupa de los genéricos y se conserva la seguridad de tipo del código.
Ahora veamos cómo se transforma el código anterior con la construcción for-each:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; class Main { public static void main(String[] args) { List<String> colors = new ArrayList<>(Arrays.asList("Blue", "Red", "Green")); // lista recorrida usando la construcción for-each for (String i: colors) { System.out.println(i); } } } |
Resultado:
Blue
Red
Green
¿Cuándo no usar el bucle for mejorado?
Hemos visto las ventajas del ciclo for-each sobre el iterador. Pero ForEach
no es un simple reemplazo para el iterador. Dado que el bucle for-each oculta el iterador de una colección y la variable de índice en una array, hay algunas cosas que solo pueden hacer un iterador y un bucle for simple. Por ejemplo,
- No podemos eliminar ningún elemento de la colección mientras la recorremos usando
ForEach
. Pero se puede hacer fácilmente usando el iteradorremove()
método. - No podemos modificar elementos en una array o una colección a medida que la recorre utilizando ForEach.
- No podemos iterar sobre múltiples colecciones en paralelo usando
ForEach
.
Más ejemplos
1. Iterando sobre una array
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// Versión no genérica public static void iterateArray (int[] A) { for (int i: A) { System.out.println(i); } } // Versión genérica public static<T> void iterateObjectArray (T[] A) { for (T i: A) { System.out.println(i); } } |
2. Iterando sobre una lista
1 2 3 4 5 |
public static<T> void iterateList(List<T> list) { for (T e: list) { System.out.println(e); } } |
3. Iterando sobre un conjunto
1 2 3 4 5 |
public static<T> void iterateSet(Set<T> set) { for (T e: set) { System.out.println(e); } } |
4. Iterando sobre un mapa
1 2 3 4 5 |
public static<K, V> void iterateMap(Map<K, V> map) { for (Map.Entry<K, V> entry: map.entrySet()) { System.out.println("{" + entry.getKey() + ":" + entry.getValue() + "}"); } } |
Eso es todo sobre bucle for mejorado en Java.
Lea también: