Ich habe eine Schnittstelle, die zurückkehrt java.lang.Iterable<T>
.
Ich möchte dieses Ergebnis mit der Java 8 Stream-API bearbeiten.
Iterable kann jedoch nicht "streamen".
Haben Sie eine Idee, wie Sie das Iterable als Stream verwenden können, ohne es in List zu konvertieren?
java
java-8
java-stream
iterable
Rayman
quelle
quelle
myIterable.stream()
das nicht gibt!Stream.of(iterable)
produziertStream<Iterable<Object>>
.Antworten:
Es gibt eine viel bessere Antwort als die
spliteratorUnknownSize
direkte Verwendung , was sowohl einfacher ist als auch ein besseres Ergebnis liefert.Iterable
hat einespliterator()
Methode, also sollten Sie diese nur verwenden, um Ihren Spliterator zu erhalten. Im schlimmsten Fall handelt es sich um denselben Code (der von der Standardimplementierung verwendet wirdspliteratorUnknownSize
). Im häufigeren Fall, wennIterable
es sich bereits um eine Sammlung handelt, erhalten Sie einen besseren Spliterator und damit eine bessere Stream-Leistung (möglicherweise sogar eine gute Parallelität). Es ist auch weniger Code:Wie Sie sehen können, ist es nicht sehr schmerzhaft , einen Stream von einem
Iterable
(siehe auch diese Frage ) zu erhalten.quelle
Stream
wäre schön gewesen, zBStream.ofIterable(iterable)
.Wenn Sie die Guava-Bibliothek seit Version 21 verwenden können, können Sie sie verwenden
quelle
Lists.newArrayList(Iterable)
.Sie können ganz einfach ein
Stream
aus einemIterable
oder erstellenIterator
:quelle
stream(...)
Ihr Code aufgerufen, um Ihren Code zu überladen?Ich möchte vorschlagen, die JOOL- Bibliothek zu verwenden, die die Spliterator-Magie hinter dem (iterierbaren) Seq.seq-Aufruf verbirgt und eine ganze Reihe zusätzlicher nützlicher Funktionen bietet.
quelle
Wie in einer anderen Antwort erwähnt, unterstützt Guava dies durch die Verwendung von:
Ich möchte hervorheben, dass die Implementierung etwas anderes macht als andere vorgeschlagene Antworten. Wenn das
Iterable
vom Typ istCollection
, werfen sie es.quelle
Ich habe diese Klasse erstellt:
Ich denke, es ist perfekt lesbar, weil Sie nicht an Spliteratoren und Boolesche Werte denken müssen (isParallel).
quelle
Eine sehr einfache Lösung für dieses Problem besteht darin, eine
Streamable<T>
Schnittstellenerweiterung zu erstellenIterable<T>
, die einedefault <T> stream()
Methode enthält.Jetzt können alle Ihre
Iterable<T>
s trivial streambar gemacht werden, indem Sie sieimplements Streamable<T>
stattdessen deklarierenIterable<T>
.quelle
Wenn Sie Vavr (früher bekannt als Javaslang) verwenden, kann dies so einfach sein wie:
quelle
Eine andere Möglichkeit, mit Java 8 und ohne externe Bibliotheken:
quelle