Wie schalte ich eine Java-Enumeration in einen Stream???
Habe ich eine Drittanbieter-Bibliothek, die gibt mir eine Enumeration<String>
. Ich möchte mit dieser Aufzählung träge wie ein Java-8 Stream
, ruft Dinge wie filter
, map
und flatMap
drauf.
Gibt es eine Bibliothek, bei der das in es? Ich bin schon Referenzierung Guave und Apache-Commons-wenn also entweder die haben die Lösung, das wäre ideal.
Alternativ, was ist der beste/einfachste Weg, um ein Enumeration
in eine Stream
unter Beibehaltung der faulen Natur von allem?
- Verwandte: Durchlaufen, die eine Enumeration in Java 8
- Die Frage ist zu Fragen, wie man aus einer
Enumeration
(Java 1.0) in eineIterator
(Java 1.2). Ich Frage Sie, wie schalten Sie es in einenStream
(Java 1.8). Während scheint es, dass die Letzte Antwort in der verlinkten Frage, Antworten diese, dass die Antwort falsch ist, für die Frage. Das Antwort sollte werden, die hier bereitgestellt werden, so dass zukünftige Forscher können erfolgreich finden es. Vielleicht @ArneBurmeister möchten, kopieren Sie die Antwort hier, so dass diese Frage direkt beantworten? - Wieder geöffnet, wie die Antworten der verlinkten Frage nicht diskutieren, das lazy-Verhalten und es wäre auch nicht der richtige Ort zum posten alternative Möglichkeiten zum erstellen einer
Stream
(als das ist nicht den Umfang der verlinkten Frage).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Antwort bietet bereits eine Lösung an, die erstellt eine
Stream
aus einemEnumeration
:Es sollte betont werden, dass die resultierende
Stream
ist so faul wie jeder andereStream
, da er nicht alle Gegenstände, bevor die terminal-Aktion eingeleitet wurde und wenn die terminal-Betrieb ist Kurzschluss, es wird iteriert werden nur so viele Elemente wie nötig.Trotzdem hat es Raum für Verbesserungen. Ich würde immer noch eine
forEachRemaining
Methode, wenn es eine straight-forward-Methode für die Verarbeitung aller Elemente. Gesagt-Methode aufgerufen werden, indem dieStream
Umsetzung für die meisten nicht-Kurzschluss-Operationen:Jedoch, der code oben ist ein Opfer der "mit
Iterator
weil es so vertraut" antipattern. Die erstelltenIterator
erhalten eingewickelt in eine Implementierung der neuenSpliterator
- Schnittstelle und bietet keinen Vorteil gegenüber der UmsetzungSpliterator
direkt:Auf dem Quell-code-Ebene, diese Implementierung ist so einfach wie die
Iterator
-basiert, sondern beseitigt die delegation ausSpliterator
zu einemIterator
. Es erfordert nur Ihre Leser zu erfahren, über das neue API.Enumeration
wissen wir nicht, ob die Reihenfolge eine Bedeutung hat, müssen wir davon ausgehen, dass es könnte haben einen Sinn und geben diese Eigenschaft. Der Anrufer kann Sie noch rufenunordered()
auf dem stream, wenn Sie wissen, dass die Reihenfolge ist irrelevant für die bestimmten Daten, zum aktivieren der Optimierungen. Aber unsere erste Prämisse muss sein, dass die Reihenfolge könnte wichtig sein.Warum nicht mit Vanille-Java :
Jedoch als wissen von @MicahZoltu, die Anzahl der Elemente in der Aufzählung berücksichtigt werden, da
Collections.list
wird die erste Iteration über die enumeration zu kopieren die Elemente in einemArrayList
. Von dort aus werden die regelmäßigenstream
Methode verwendet werden kann. Dies ist zwar üblich für viele Sammlung stream-Operationen, wenn die Aufzählung ist zu groß (wie unendlich), kann dies zu Problemen führen, da die enumeration umgewandelt werden in eine Liste, dann den anderen Ansätzen, die hier beschrieben wird, sollte stattdessen verwendet werden.enumeration
, um Sie in eine Liste und dann geben Sie die stream-Zugriff auf die Liste. Wenn die Aufzählung ist klein, das ist wohl ein vernünftiger Ansatz. Wenn die Aufzählung ist sehr groß, könnte dies ein teurer und unnötiger Vorgang. Wenn die Aufzählung ist unendlich, dieser stürzt Ihre Anwendung.In Java 9 ist es möglich, zu konvertieren, ein
Enumeration
zu einemStream
mit einem one-liner:(Gut, es ist eine ziemlich lange Zeile.)
Wenn Sie nicht auf Java 9, können Sie konvertieren die
Enumeration
in eineIterator
manuell mit Hilfe der Technik in Holger ' s Antwort.Laut Guave docs, könnten Sie die
Iterators.forEnumeration()
Methode:Und in diese Frage, es wird erklärt, wie man einen stream von einem iterator:
In meinem StreamEx Bibliothek gibt ' s einfache Methode
StreamEx.der(Aufzählung)
, die nicht den job:Beachten Sie, dass es nicht nur eine Verknüpfung zu der @Holger Lösung, aber umgesetzt in unterschiedlicher Art und Weise. Insbesondere hat es deutlich bessere parallele Ausführung Eigenschaften im Vergleich zu Lösungen mit
Spliterators.spliteratorUnknownSize()
.