Effizientes Kopieren von Streams, um „Stream Closed“-Fehler zu verhindern
Java 8-Streams bieten einen leistungsstarken Mechanismus für die Datenverarbeitung, sind jedoch nur für den einmaligen Gebrauch bestimmt Die Natur kann manchmal eine Herausforderung darstellen, wenn mehrere Vorgänge für dieselben Daten erforderlich sind. Dieses Problem äußert sich in der Fehlermeldung „Stream wurde bereits bearbeitet oder geschlossen“.
Problembeschreibung:
Um den oben genannten Fehler zu vermeiden, greifen einige Entwickler auf die Konvertierung von Streams zurück vor der Verarbeitung in Listen einfügen. Obwohl dieser Ansatz funktioniert, kann er die Effizienz beeinträchtigen und zusätzliche Schritte erfordern. Können wir eine elegantere und effizientere Lösung finden?
Antwort:
Die Annahme, dass das Kopieren eines Streams effizienter ist als das Speichern, ist nicht ganz korrekt. In Fällen, in denen Daten mehrfach wiederverwendet werden müssen, ist entweder Speicherung oder Stream-Aufteilung erforderlich.
Streams bieten erhebliche Optimierungen für Single-Use-Szenarien, wie z. B. Loop Fusion, die eine effiziente Verarbeitung der gesamten Datenpipeline ermöglicht. Die Wiederverwendung derselben Daten erfordert jedoch entweder deren zweimaliges Generieren oder Speichern.
Der Versuch, „gegabelte Streams“ in Java-Streams zu implementieren, erwies sich als kostspielig und belastete den häufigen Fall der einmaligen Verwendung für den seltenen Fall der Wiederverwendung. Die Herausforderung entsteht, wenn die beiden Pipelines Daten unterschiedlich schnell verbrauchen, was eine Pufferung erforderlich macht.
Empfohlene Ansätze:
<code class="java">stream()...stuff....forEach(e -> { consumerA(e); consumerB(e); });</code>
Alternative Option:
Das obige ist der detaillierte Inhalt vonWie kann man Streams in Java effizient kopieren, um „Stream Closed'-Fehler zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!