Java 8 Stream IllegalStateException: Stream wurde bereits operiert wurden oder geschlossen
Ich versuche zu generieren, Um Instanzen, die mit der Stream-API. Ich habe eine factory-Funktion, die erstellt die Bestellung und eine DoubleStream dient zum initialisieren der Menge der Bestellung.
private DoubleStream doubleStream = new Random().doubles(50.0, 200.0);
private Order createOrder() {
return new Order(doubleStream.findFirst().getAsDouble());
}
@Test
public void test() {
Stream<Order> orderStream = Stream.generate(() -> {
return createOrder();
});
orderStream.limit(10).forEach(System.out::println);
Wenn ich initialisieren die Instanz, Um mit einem literalen (1.0), dies funktioniert gut. Wenn ich den doubleStream zu erstellen, die eine zufällige Menge, die exception geworfen wird.
Irgendeine Idee, wie man dieses Problem beheben?
TIA,
Ole
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist in der javadoc von
Stream
(Hervorhebungen von mir):Und in Ihrem code verwenden Sie die stream zweimal (einmal in
createOrder()
und die weitere Verwendung, wenn Sie.limit().forEach()
Wie gesagt in anderen Antworten
Stream
s Einzel-Elemente verwenden, und erstellen Sie eine neueStream
jedes mal, wenn Sie einen benötigen.Aber, nach allem, dies ist nicht kompliziert, wenn Sie entfernen Sie alle Ihre versuche, um Zwischenergebnisse zu speichern. Ihre gesamte code kann wie folgt ausgedrückt werden:
oder noch einfacher
map
werdenmapToObj
wie verändert es die Art von primitiven Typdouble
zu einem Referenz-Typ, fixiert es.Wie fge Staaten, Sie kann nicht (sollte nicht) verbrauchen
Stream
mehr als einmal.Aus der Javadoc von
Random#doubles(double, double)
Implementieren Sie diese Methode und verwenden Sie es, um eine neue
double
Wert jeder Zeit, die Sie brauchen, anstatt zu versuchen, um es von einemDoubleStream
. Möglicherweise verwenden Sie einenDoubleSupplier
.Wenn du nicht gehst, um die Wiederverwendung der
nextDouble
Methode, Sie können inline die Werte50.0
und200.0
.Danke, das war sehr hilfreich. Ich kam auch mit einer anderen Implementierung, die funktioniert gut für jetzt:
Nochmals vielen Dank!
Ole
Ihre Methode könnte ein Einzeiler wie dieser statt. Sie benötigen
mapToObj
, nichtmap
Sollten Sie verwenden, Lieferanten-Funktion Schnittstelle für die Initialisierung wie diese
Und ändern Sie Ihren Weg, um doppelte wie diese
Dann funktioniert es normalerweise.
Fand diese Art und Weise von der post Stream wurde schon operiert oder geschlossen Ausnahme