Ich lerne die neuen Funktionen von Java 8, und während ich mit Streams (java.util.stream.Stream) und Collectors experimentiere, habe ich festgestellt, dass ein Stream nicht zweimal verwendet werden kann. Gibt es einen Weg, ihn wiederzuverwenden?Gibt es eine Möglichkeit, einen Stream in Java 8 wiederzuverwenden?
Antwort
Vom documentation:
Ein Strom nur einmal betätigt werden sollte (Aufrufen eines Zwischen- oder Terminalstrom-Betrieb).
Eine Stream-Implementierung kann IllegalStateException auslösen, wenn sie erkennt, dass der Stream wiederverwendet wird.
Also die Antwort ist nein, Streams sollen nicht wiederverwendet werden.
Die ganze Idee des Streams ist, dass es einmalig ist. Dadurch können Sie nicht-reentrierbare Quellen (z. B. das Lesen der Zeilen von der Netzwerkverbindung) ohne Zwischenspeicherung erstellen. Wenn Sie jedoch das Streamen von Inhalten wiederverwenden möchten, können Sie es in die Zwischen Sammlung werfen den „hard copy“ zu bekommen:
Stream<MyType> stream = // get the stream from somewhere
List<MyType> list = stream.collect(Collectors.toList()); // materialize the stream contents
list.stream().doSomething // create a new stream from the list
list.stream().doSomethingElse // create one more stream from the list
Wenn Sie nicht wollen, um den Strom materialisieren, da in einigen Fällen sind Möglichkeiten, mehrere Dinge gleichzeitig mit demselben Stream zu tun. Zum Beispiel können Sie sich auf this oder this Frage für Details beziehen.
Wenn Sie den Effekt der Wiederverwendung eines Streams nutzen möchten, können Sie den Stream-Ausdruck in einen Lieferanten verpacken und myStreamSupplier.get() aufrufen, wenn Sie einen neuen Stream wünschen. Zum Beispiel
Wie andere gesagt haben, "nein, du kannst nicht".
Aber es ist nützlich, um die handliche summaryStatistics()
für viele grundlegende Vorgänge zu erinnern:
Also statt:
List<Person> personList = getPersons();
personList.stream().mapToInt(p -> p.getAge()).average().getAsDouble();
personList.stream().mapToInt(p -> p.getAge()).min().getAsInt();
personList.stream().mapToInt(p -> p.getAge()).max().getAsInt();
Sie können:
// Can also be DoubleSummaryStatistics from mapToDouble()
IntSummaryStatistics stats = personList.stream()
.mapToInt(p-> p.getAge())
.summaryStatistics();
stats.getAverage();
stats.getMin();
stats.getMax();
- 1. Gibt es eine Möglichkeit, eine bereits geschlossene WPF-Fensterinstanz wiederzuverwenden
- 2. Gibt es eine Möglichkeit, eine verschachtelte Generikum Angabe ohne einen Typ zweimal in Java Angabe 8+
- 3. Java 8 - stream Ideologie
- 4. Java 8-Stream in Stream-Parallelität
- 5. Java 8 Stream
- 6. Gibt es einen effizienteren Java 8 Stream-Ansatz, um den Index in einem int [] zu finden?
- 7. Gibt es in Java 8 eine ByteStream-Klasse?
- 8. Java 8 Stream-groupingby
- 9. Schließen Java 8 Stream
- 10. Java 8 modify stream elements
- 11. Ist es möglich, eine faule groupby, einen Stream, in Java 8 zu tun?
- 12. Java 8 Stream Multithreading
- 13. gibt es eine gute Möglichkeit, Stream Manipulatoren zu kombinieren?
- 14. Parallel-Stream gibt null Elemente, wie in Java 8
- 15. Gibt es eine Möglichkeit, in Netbeans 8 automatisch zu speichern?
- 16. Java 8 | Parallel-Stream für eine HashMap
- 17. Sortieren nach Eigenschaft in Java 8 stream
- 18. Partition ein Java 8 Stream
- 19. Java-8-Stream bekommen alle
- 20. einen Byte-Stream in eine Java-Klasse
- 21. Gibt es eine Möglichkeit, einen Standardeigenschaftswert in Spring XML anzugeben?
- 22. Gibt es eine einfache Möglichkeit, einen RTP-Video/Audio-Stream in WPF abzuspielen?
- 23. Gibt es eine Möglichkeit, einen Stream aus dem Debugger in VS
- 24. Gibt es eine elegante Möglichkeit, einen Stream in Chunks zu verarbeiten?
- 25. Java 8 Stream in der Hauptmethode
- 26. Wie konvertiere ich einen Java 8 IntStream in eine Liste?
- 27. Java 8 Stream - überprüfen, ob Instanceof
- 28. Wie konvertiert man einen Java 8 Stream in ein Array?
- 29. Java 8 parallele Stream oder Methodenausführung
- 30. Gibt es eine IsAfter-Methode für temporäre in Java 8
Ja, Ströme wiederverwendet werden, nur dann, wenn Jede der Anwendungen ruft keine Terminaloperationen darauf auf. –
Mögliches Duplikat von [Kopieren Sie einen Stream, um zu vermeiden, dass der Stream bereits bearbeitet oder geschlossen wurde (Java 8)] (http://stackoverflow.com/questions/23860533/copy-a-stream-to-avid-stream- has-bereits-operated-on-or-closed-java-8) – Andrejs