Ich versuche, Order-Instanzen mithilfe der Stream-API zu generieren. Ich habe eine Factory-Funktion, die den Auftrag erstellt, und ein DoubleStream wird verwendet, um den Betrag der Bestellung zu initialisieren.
%Vor%Wenn ich die Order-Instanz mit einem Literal (1.0) initialisiere, funktioniert das problemlos. Wenn ich den DoubleStream zum Erstellen eines zufälligen Betrags verwende, wird die Ausnahme ausgelöst.
Irgendeine Idee, wie Sie das beheben können?
TIA,
Ole
Die Antwort ist im Javadoc von Stream
(betont meins):
Ein Stream sollte nur einmal () aufgerufen werden (Aufruf einer Zwischen- oder Terminal-Stream-Operation). Dies schließt zum Beispiel "gegabelte" Ströme aus, wobei die gleiche Quelle zwei oder mehr Pipelines oder mehrere Traversierungen desselben Stroms speist. Eine Stream-Implementierung kann IllegalStateException auslösen, wenn sie feststellt, dass der Stream wiederverwendet wird .
Und in Ihrem Code verwenden Sie den Stream zweimal (einmal in createOrder()
und die andere Verwendung bei .limit().forEach()
Wie bereits in anderen Antworten erwähnt, sind Stream
s Einwegartikel und Sie müssen jedes Mal, wenn Sie eins benötigen, ein neues Stream
erstellen.
Aber schließlich ist das nicht kompliziert, wenn Sie alle Ihre Versuche entfernen, Zwischenergebnisse zu speichern. Ihr gesamter Code kann wie folgt ausgedrückt werden:
%Vor%oder noch einfacher
%Vor% Wie fge angibt , können Sie Stream
nicht mehr als einmal konsumieren (sollten) / p>
Irgendeine Idee, wie Sie das beheben können?
Aus dem Javadoc von Random#doubles(double, double)
Ein Pseudozufallsdoppelwert wird erzeugt, als ob es das Ergebnis von ist Aufruf der folgenden Methode mit dem Ursprung und der Grenze:
%Vor%
Implementieren Sie eine solche Methode und verwenden Sie sie, um jedes Mal einen neuen double
-Wert zu erhalten, anstatt zu versuchen, sie von einem DoubleStream
zu erhalten. Möglicherweise verwenden Sie DoubleSupplier
.
Wenn Sie die Methode nextDouble
nicht wiederverwenden, können Sie die Werte 50.0
und 200.0
inline einfügen.
Ihre Methode könnte stattdessen ein Einstrich sein. Sie müssen mapToObj
, nicht map
Sie sollten die Supplier-Funktionsschnittstelle für Ihre Initialisierung wie folgt verwenden
%Vor%Und ändere deinen Weg, um doppelt so zu werden
%Vor%Dann funktioniert es normal.
Dieser Weg wurde aus dem Post Stream wurde bereits betrieben oder geschlossen Ausnahme
Tags und Links java java-8 java-stream data-generation