Mam interfejs, który zwraca java.lang.Iterable<T>
.
Chciałbym manipulować tym wynikiem przy użyciu interfejsu API Java 8 Stream.
Jednak Iterable nie może „przesyłać strumieniowo”.
Masz pomysł, jak używać Iterable jako strumienia bez konwertowania go na List?
java
java-8
java-stream
iterable
rayman
źródło
źródło
myIterable.stream()
nie istnieje!Stream.of(iterable)
produkujeStream<Iterable<Object>>
.Odpowiedzi:
Odpowiedź jest znacznie lepsza niż
spliteratorUnknownSize
bezpośrednie, co jest łatwiejsze i daje lepszy wynik.Iterable
maspliterator()
metodę, więc powinieneś jej użyć, aby uzyskać swój spliterator. W najgorszym przypadku jest to ten sam kod (używana jest implementacja domyślnaspliteratorUnknownSize
), ale w bardziej powszechnym przypadku, gdy TwojaIterable
kolekcja jest już zbiorem, otrzymasz lepszy spliterator, a zatem lepszą wydajność strumienia (może nawet dobrą równoległość). To także mniej kodu:Jak widać, uzyskanie strumienia z
Iterable
(patrz także to pytanie ) nie jest bardzo bolesne.źródło
Stream
, npStream.ofIterable(iterable)
.Jeśli możesz korzystać z biblioteki Guava, od wersji 21 możesz używać
źródło
Lists.newArrayList(Iterable)
.Można łatwo utworzyć
Stream
Out OfIterable
lubIterator
:źródło
stream(...)
zaśmiecania kodu?Chciałbym zasugerować użycie biblioteki JOOL , która ukrywa magię spliteratora za wywołaniem Seq.seq (iterable), a także zapewnia całą masę dodatkowych przydatnych funkcji.
źródło
Tak więc, jak wspomniano w innej odpowiedzi, Guava wspiera to za pomocą:
Chcę podkreślić, że implementacja robi coś nieco innego niż inne sugerowane odpowiedzi. Jeśli
Iterable
jest typuCollection
, rzucają go.źródło
Stworzyłem tę klasę:
Myślę, że jest to doskonale czytelne, ponieważ nie musisz myśleć o spliteratorach i booleanach (isParallel).
źródło
Bardzo prostym obejściem tego problemu jest utworzenie
Streamable<T>
rozszerzenia interfejsuIterable<T>
zawierającegodefault <T> stream()
metodę.Teraz każdy z twoich
Iterable<T>
może być w prosty sposób udostępniony do streamingu, po prostu zadeklarując jeimplements Streamable<T>
zamiastIterable<T>
.źródło
Jeśli zdarzy ci się korzystać z Vavr (wcześniej znanego jako JavaScript), może to być tak proste, jak:
źródło
Innym sposobem na to, z Java 8 i bez zewnętrznych bibliotek:
źródło