J'ai un enum
en Java pour les directions cardinales et intermédiaires:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
Comment puis-je écrire une
for
boucle qui parcourt chacune de cesenum
valeurs?
Réponses:
.values()
Vous pouvez appeler la
values()
méthode sur votre énumération.Cette
values()
méthode est implicitement déclarée par le compilateur . Il n'est donc pas répertorié dans leEnum
doc.la source
Toutes les constantes d'un type enum peuvent être obtenues en appelant la
public static T[] values()
méthode implicite de ce type:la source
#
?Enum#values()
=Enum.values()
.
(toujours?)?Vous pouvez le faire comme suit:
la source
Arrays.stream(Enum.values()).forEach(...)
- le flux sera séquentielset
lieu dearray
. Ce n'est pas "mieux", bien qu'il décrive mieux les valeurs d'énumération, car d'après la définition de set, les valeurs de set ne peuvent pas être répétées (comme dans enum), alors que les valeurs dans array peuvent l'être.Ruisseaux
Avant Java 8
Java 8
Nous pouvons également utiliser lambda et les streams ( Tutorial ):
Pourquoi
forEachOrdered
et nonforEach
avec des streams?Le comportement de
forEach
est explicitement non déterministe alors que leforEachOrdered
effectue une action pour chaque élément de ce flux, dans l'ordre de rencontre du flux si le flux a un ordre de rencontre défini.forEach
Ne garantit donc pas que la commande sera conservée.De plus, lorsque vous travaillez avec des flux (en particulier des flux parallèles), gardez à l'esprit la nature des flux. Selon le doc :
Les résultats du pipeline de flux peuvent être non déterministes ou incorrects si les paramètres de comportement des opérations de flux sont avec état. Un lambda avec état est un dont le résultat dépend de tout état qui pourrait changer pendant l'exécution du pipeline de flux.
Ici, si l'opération de mappage est effectuée en parallèle, les résultats pour la même entrée peuvent varier d'une exécution à l'autre, en raison de différences de planification des threads, tandis qu'avec une expression lambda sans état, les résultats seraient toujours les mêmes.
Les effets secondaires des paramètres de comportement pour les opérations de flux sont, en général, découragés, car ils peuvent souvent conduire à des violations involontaires de l'apatridie, ainsi qu'à d'autres dangers liés à la sécurité des threads.
Les flux peuvent avoir ou non un ordre de rencontre défini. Le fait qu'un flux ait ou non un ordre de rencontre dépend de la source et des opérations intermédiaires.
la source
la source
Si vous ne vous souciez pas de la commande, cela devrait fonctionner:
la source
EnumSet
: L'itérateur retourné par la méthode itérateur traverse les éléments dans leur ordre naturel (l'ordre dans lequel les constantes d'énumération sont déclarées) . Cela garantit que l'ordre d'itération correspond à la commande retournée parEnum.values()
.la source
Java8
de Java5 +
la source
Essayez d'utiliser un pour chacun
la source
Plus de méthodes dans java 8:
Utilisation
EnumSet
avecforEach
Utilisation
Arrays.asList
avecforEach
la source