Eu tenho uma interface que retorna java.lang.Iterable<T>
.
Gostaria de manipular esse resultado usando a API Java 8 Stream.
No entanto, o Iterable não pode "transmitir".
Alguma idéia de como usar o Iterable como um fluxo sem convertê-lo em lista?
java
java-8
java-stream
iterable
rayman
fonte
fonte
myIterable.stream()
não existe!Stream.of(iterable)
produzStream<Iterable<Object>>
.Respostas:
Há uma resposta muito melhor do que usar
spliteratorUnknownSize
diretamente, o que é mais fácil e obtém um resultado melhor.Iterable
tem umspliterator()
método, então você deve usá-lo apenas para obter seu spliterator. Na pior das hipóteses, é o mesmo código (a implementação padrão usaspliteratorUnknownSize
), mas no caso mais comum, onde vocêIterable
já é uma coleção, você obtém um melhor spliterator e, portanto, melhor desempenho do fluxo (talvez até um bom paralelismo). Também é menos código:Como você pode ver, obter um fluxo de um
Iterable
(consulte também esta pergunta ) não é muito doloroso.fonte
Stream
seria bom, por exemploStream.ofIterable(iterable)
.Se você pode usar a biblioteca Guava, desde a versão 21, você pode usar
fonte
Lists.newArrayList(Iterable)
.Você pode criar facilmente um
Stream
de umIterable
ouIterator
:fonte
stream(...)
desorganizar seu código?Eu gostaria de sugerir o uso da biblioteca JOOL , que oculta a mágica do spliterator por trás da chamada Seq.seq (iterável) e também fornece várias funcionalidades úteis adicionais.
fonte
Portanto, como outra resposta mencionada, o Guava tem suporte para isso usando:
Quero destacar que a implementação faz algo ligeiramente diferente das outras respostas sugeridas. Se o
Iterable
é do tipo,Collection
eles o lançam.fonte
Eu criei esta classe:
Eu acho que é perfeitamente legível, porque você não precisa pensar em separadores e booleanos (isParallel).
fonte
Uma solução muito simples para esse problema é criar uma
Streamable<T>
interfaceIterable<T>
que se estende que contém umdefault <T> stream()
método.Agora, qualquer um dos seus
Iterable<T>
s pode ser trivialmente tornado estrias apenas declarando-os emimplements Streamable<T>
vez deIterable<T>
.fonte
Se você usa o Vavr (anteriormente conhecido como Javaslang), isso pode ser tão fácil quanto:
fonte
Outra maneira de fazer isso, com o Java 8 e sem bibliotecas externas:
fonte