Eu tenho um enum
em Java para as direções cardinal e intermediária:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
Como posso escrever um
for
loop que itera através de cada um dessesenum
valores?
Respostas:
.values()
Você pode chamar o
values()
método na sua enumeração.Este
values()
método é declarado implicitamente pelo compilador . Portanto, não está listado noEnum
documentofonte
Todas as constantes de um tipo de enum podem ser obtidas chamando o
public static T[] values()
método implícito desse tipo:fonte
#
faz?Enum#values()
=Enum.values()
.
(sempre?)?Você pode fazer isso da seguinte maneira:
fonte
Arrays.stream(Enum.values()).forEach(...)
- o fluxo será seqüencial #set
vez dearray
. Não é "melhor", embora descreva valores de enum melhor na minha opinião, porque da definição de conjunto, os valores em conjunto não podem ser repetidos (como em enum), enquanto os valores em matriz podem ser.Streams
Antes do Java 8
Java 8
Também podemos usar lambda e streams ( Tutorial ):
Por que
forEachOrdered
e nãoforEach
com fluxos?O comportamento de
forEach
é explicitamente não determinístico, onde comoforEachOrdered
executa uma ação para cada elemento desse fluxo, na ordem de encontro do fluxo, se o fluxo tiver uma ordem de encontro definida. assimforEach
, não garante que o pedido seja mantido.Além disso, ao trabalhar com fluxos (especialmente os paralelos), lembre-se da natureza dos fluxos. De acordo com o documento :
Os resultados do pipeline de fluxo podem não ser determinísticos ou incorretos se os parâmetros comportamentais para as operações de fluxo forem stateful. Um lambda com estado é aquele cujo resultado depende de qualquer estado que possa mudar durante a execução do pipeline de fluxo.
Aqui, se a operação de mapeamento for executada em paralelo, os resultados para a mesma entrada podem variar de execução para execução, devido a diferenças de planejamento de encadeamento, enquanto que, com uma expressão lambda sem estado, os resultados sempre serão os mesmos.
Os efeitos colaterais nos parâmetros comportamentais das operações de fluxo são, em geral, desencorajados, pois geralmente podem levar a violações involuntárias do requisito de apatridia, bem como a outros riscos de segurança da thread.
Os fluxos podem ou não ter uma ordem de encontro definida. O fato de um fluxo ter ou não uma ordem de encontro depende da origem e das operações intermediárias.
fonte
fonte
Se você não se importa com o pedido, isso deve funcionar:
fonte
EnumSet
: O iterador retornado pelo método do iterador percorre os elementos em sua ordem natural (a ordem na qual as constantes da enumeração são declaradas) . Isso garante que a ordem da iteração corresponda à ordem retornada porEnum.values()
.fonte
Java8
do Java5 +
fonte
Tente usar um para cada
fonte
Mais métodos em java 8:
Usando
EnumSet
comforEach
Usando
Arrays.asList
comforEach
fonte