Corrientes
Antes de Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
También podemos hacer uso de lambda y streams ( Tutorial ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
¿Por qué forEachOrdered
y no forEach
con corrientes?
El comportamiento de forEach
es explícitamente no determinista donde, a medida que forEachOrdered
realiza una acción para cada elemento de esta secuencia, en el orden de encuentro de la secuencia si la secuencia tiene un orden de encuentro definido. Por forEach
lo tanto , no garantiza que se mantenga el pedido.
Además, cuando trabaje con flujos (especialmente los paralelos) tenga en cuenta la naturaleza de los flujos. Según el documento :
Los resultados de la canalización de flujo pueden ser no deterministas o incorrectos si los parámetros de comportamiento para las operaciones de flujo son con estado. Una lambda con estado es aquella cuyo resultado depende de cualquier estado que pueda cambiar durante la ejecución de la canalización de flujo.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
Aquí, si la operación de mapeo se realiza en paralelo, los resultados para la misma entrada podrían variar de una ejecución a otra, debido a las diferencias de programación de subprocesos, mientras que, con una expresión lambda sin estado, los resultados siempre serían los mismos.
En general, se desaconsejan los efectos secundarios en los parámetros de comportamiento para transmitir las operaciones, ya que a menudo pueden conducir a violaciones involuntarias del requisito de apatridia, así como a otros riesgos de seguridad de hilos.
Las transmisiones pueden o no tener un orden de encuentro definido. Si un flujo tiene o no un orden de encuentro depende de la fuente y de las operaciones intermedias.