Ströme
Vor Java 8
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
Java 8
Wir können auch lambda und Streams verwenden ( Anleitung ):
Stream.of(Direction.values()).forEachOrdered(System.out::println);
Warum forEachOrdered
und nicht forEach
mit Strömen ?
Das Verhalten von forEach
explizit nicht-deterministisch ist, während die forEachOrdered
führt für jedes Element dieses Datenstroms eine Aktion aus, und zwar in der Reihenfolge der Begegnungen, wenn der Datenstrom eine bestimmte Reihenfolge der Begegnungen hat. Also forEach
garantiert nicht, dass der Auftrag ausgeführt wird.
Auch bei der Arbeit mit Datenströmen (insbesondere parallelen) ist die Natur von Datenströmen zu beachten. Gemäß der doc :
Die Ergebnisse von Stream-Pipelines können nicht deterministisch oder falsch sein, wenn die Verhaltensparameter der Stream-Operationen zustandsabhängig sind. Ein zustandsabhängiges Lambda ist ein Lambda, dessen Ergebnis von einem 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; })...
Wird die Mapping-Operation parallel durchgeführt, können die Ergebnisse für dieselbe Eingabe aufgrund von Unterschieden in der Thread-Planung von Lauf zu Lauf variieren, wohingegen die Ergebnisse bei einem zustandslosen Lambda-Ausdruck immer die gleichen sind.
Von Seiteneffekten in Verhaltensparametern für Stream-Operationen wird im Allgemeinen abgeraten, da sie oft zu unwissentlichen Verstößen gegen die Anforderung der Zustandslosigkeit sowie zu anderen Gefahren für die Thread-Sicherheit führen können.
Ströme können eine bestimmte Reihenfolge der Begegnungen haben, müssen es aber nicht. Ob ein Datenstrom eine Begegnungsreihenfolge hat oder nicht, hängt von der Quelle und den Zwischenoperationen ab.
0 Stimmen
Java 8 : stackoverflow.com/a/30962181/1216775