En Java 8, tenemos un método forEach recientemente introducido para iterar sobre colecciones y flujos en Java. En esta guía, aprenderemos cómo usar los métodos forEach () y forEachOrdered () para recorrer una colección y un flujo en particular.
Java 8 – forEach para iterar un mapa
import java.util.Map; import java.util.HashMap; public class Example { public static void main(String[] args) { Map<Integer, String> hmap = new HashMap<Integer, String>(); hmap.put(1, "Monkey"); hmap.put(2, "Dog"); hmap.put(3, "Cat"); hmap.put(4, "Lion"); hmap.put(5, "Tiger"); hmap.put(6, "Bear"); /* forEach to iterate and display each key and value pair * of HashMap. */ hmap.forEach((key,value)->System.out.println(key+" - "+value)); /* forEach to iterate a Map and display the value of a particular * key */ hmap.forEach((key,value)->{ if(key == 4){ System.out.println("Value associated with key 4 is: "+value); } }); /* forEach to iterate a Map and display the key associated with a * particular value */ hmap.forEach((key,value)->{ if("Cat".equals(value)){ System.out.println("Key associated with Value Cat is: "+key); } }); } }
Producción:
Java 8 – forEach para iterar a través de una lista
En este ejemplo, estamos iterando una ArrayList usando el método forEach (). Dentro de forEach estamos usando una expresión lambda para imprimir cada elemento de la lista.
import java.util.List; import java.util.ArrayList; public class Example { public static void main(String[] args) { List<String> fruits = new ArrayList<String>(); fruits.add("Apple"); fruits.add("Orange"); fruits.add("Banana"); fruits.add("Pear"); fruits.add("Mango"); //lambda expression in forEach Method fruits.forEach(str->System.out.println(str)); } }
Producción:
Apple Orange Banana Pear Mango
También podemos usar el método de referencia en el método forEach () así:
fruits.forEach(System.out::println);
Java 8 – método forEach para iterar una secuencia
En este ejemplo, estamos iterando una secuencia en Java usando el método forEach ().
import java.util.List; import java.util.ArrayList; public class Example { public static void main(String[] args) { List<String> names = new ArrayList<String>(); names.add("Maggie"); names.add("Michonne"); names.add("Rick"); names.add("Merle"); names.add("Governor"); names.stream() //creating stream .filter(f->f.startsWith("M")) //filtering names that starts with M .forEach(System.out::println); //displaying the stream using forEach } }
Producción:
Maggie Michonne Merle
Java – Ejemplo del método Stream forEachOrdered ()
Para los flujos secuenciales, el orden de los elementos es el mismo que el orden en la fuente, por lo que la salida sería la misma si se usa forEach o forEachOrdered. Sin embargo, cuando trabaje con flujos paralelos, siempre querrá utilizar el método forEachOrdered () cuando el orden sea importante para usted, ya que este método garantiza que el orden de los elementos sea el mismo que el del origen. Tomemos un ejemplo para comprender la diferencia entre forEach () y forEachOrdered ().
import java.util.List; import java.util.ArrayList; public class Example { public static void main(String[] args) { List<String> names = new ArrayList<String>(); names.add("Maggie"); names.add("Michonne"); names.add("Rick"); names.add("Merle"); names.add("Governor"); //forEach - the output would be in any order System.out.println("Print using forEach"); names.stream() .filter(f->f.startsWith("M")) .parallel() .forEach(n->System.out.println(n)); /* forEachOrdered - the output would always be in this order: * Maggie, Michonne, Merle */ System.out.println("Print using forEachOrdered"); names.stream() .filter(f->f.startsWith("M")) .parallel() .forEachOrdered(n->System.out.println(n)); } }
Producción:
Print using forEach Merle Maggie Michonne Print using forEachOrdered Maggie Michonne Merle