Ich habe eine enum
in Java für die Kardinal- und Zwischenrichtungen:
public enum Direction {
NORTH,
NORTHEAST,
EAST,
SOUTHEAST,
SOUTH,
SOUTHWEST,
WEST,
NORTHWEST
}
Wie kann ich eine
for
Schleife schreiben , die jeden dieserenum
Werte durchläuft ?
Antworten:
.values()
Sie können die
values()
Methode in Ihrer Enumeration aufrufen .Diese
values()
Methode wird vom Compiler implizit deklariert . Es ist also nicht inEnum
doc aufgeführt.quelle
Alle Konstanten eines Aufzählungstyps können durch Aufrufen der impliziten
public static T[] values()
Methode dieses Typs erhalten werden:quelle
#
?Enum#values()
=Enum.values()
.
(immer?)?Sie können dies wie folgt tun:
quelle
Arrays.stream(Enum.values()).forEach(...)
- der Stream wird sequentiell seinset
stattarray
. Es ist nicht "besser", obwohl es meiner Meinung nach Aufzählungswerte besser beschreibt, da nach der Definition von set Werte in set nicht wiederholt werden können (wie in enum), wohingegen Werte in Array sein können.Streams
Vor Java 8
Java 8
Wir können auch Lambda und Streams verwenden ( Tutorial ):
Warum
forEachOrdered
und nichtforEach
mit Streams?Das Verhalten von
forEach
ist explizit nicht deterministisch, wenn derforEachOrdered
Benutzer eine Aktion für jedes Element dieses Streams in der Begegnungsreihenfolge des Streams ausführt, wenn der Stream eine definierte Begegnungsreihenfolge hat. DamitforEach
garantiert nicht , dass die Reihenfolge gehalten werden würde.Beachten Sie auch bei der Arbeit mit Streams (insbesondere parallelen) die Art der Streams. Nach dem Dokument :
Die Ergebnisse der Stream-Pipeline sind möglicherweise nicht deterministisch oder falsch, wenn die Verhaltensparameter für die Stream-Operationen statusbehaftet sind. Ein Stateful Lambda ist eines, dessen Ergebnis von jedem Zustand abhängt, der sich während der Ausführung der Stream-Pipeline ändern kann.
Wenn hier die Zuordnungsoperation parallel ausgeführt wird, können die Ergebnisse für dieselbe Eingabe aufgrund von Unterschieden bei der Thread-Planung von Lauf zu Lauf variieren, während bei einem zustandslosen Lambda-Ausdruck die Ergebnisse immer dieselben wären.
Nebenwirkungen von Verhaltensparametern bei Stream-Vorgängen werden im Allgemeinen nicht empfohlen, da sie häufig zu unwissentlichen Verstößen gegen die Anforderung der Staatenlosigkeit sowie zu anderen Sicherheitsrisiken für Threads führen können.
Streams können eine definierte Begegnungsreihenfolge haben oder nicht. Ob ein Stream eine Begegnungsreihenfolge hat oder nicht, hängt von der Quelle und den Zwischenoperationen ab.
quelle
quelle
Wenn Sie sich nicht für die Reihenfolge interessieren, sollte dies funktionieren:
quelle
EnumSet
: Der von der Iterator-Methode zurückgegebene Iterator durchläuft die Elemente in ihrer natürlichen Reihenfolge (der Reihenfolge, in der die Enum-Konstanten deklariert werden) . Dies garantiert, dass die Reihenfolge der Iteration mit der von zurückgegebenen Reihenfolge übereinstimmtEnum.values()
.quelle
Java8
von Java5 +
quelle
Versuchen Sie, jeweils einen zu verwenden
quelle
Weitere Methoden in Java 8:
Verwenden
EnumSet
mitforEach
Verwenden
Arrays.asList
mitforEach
quelle