Tengo un enum
en Java para las direcciones cardinales e intermedias:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
¿Cómo puedo escribir un
for
ciclo que recorra cada uno de estosenum
valores?
Respuestas:
.values()
Puede llamar al
values()
método en su enumeración.Este
values()
método es declarado implícitamente por el compilador . Por lo tanto, no figura en elEnum
documento.fuente
Se pueden obtener todas las constantes de un tipo enum llamando al
public static T[] values()
método implícito de ese tipo:fuente
#
?Enum#values()
=Enum.values()
.
(siempre)?Puede hacer esto de la siguiente manera:
fuente
Arrays.stream(Enum.values()).forEach(...)
: la transmisión será secuencialset
lugar dearray
. No es "mejor", aunque en mi opinión describe mejor los valores de enumeración, porque desde la definición del conjunto, los valores del conjunto no pueden repetirse (como en la enumeración), mientras que los valores de la matriz pueden serlo.Corrientes
Antes de Java 8
Java 8
También podemos hacer uso de lambda y streams ( Tutorial ):
¿Por qué
forEachOrdered
y noforEach
con corrientes?El comportamiento de
forEach
es explícitamente no determinista donde, a medida queforEachOrdered
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. PorforEach
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.
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.
fuente
fuente
Si no te importa el orden, esto debería funcionar:
fuente
EnumSet
: El iterador devuelto por el método iterador atraviesa los elementos en su orden natural (el orden en que se declaran las constantes enum) . Esto garantiza que el orden de iteración coincida con el orden devuelto porEnum.values()
.fuente
Java8
de Java5 +
fuente
Intenta usar un para cada
fuente
Más métodos en java 8:
Usando
EnumSet
conforEach
Usando
Arrays.asList
conforEach
fuente