Streams
Vor Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Wir können auch Lambda und Streams verwenden ( Tutorial ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Warum forEachOrdered
und nicht forEach
mit Streams?
Das Verhalten von forEach
ist explizit nicht deterministisch, wenn der forEachOrdered
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.
Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...
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.