J'ai une interface qui revient java.lang.Iterable<T>
.
Je voudrais manipuler ce résultat en utilisant l'API Java 8 Stream.
Cependant, Iterable ne peut pas "diffuser".
Avez-vous une idée de comment utiliser l'itérable en tant que flux sans le convertir en liste?
java
java-8
java-stream
iterable
rayman
la source
la source
myIterable.stream()
n'existe pas!Stream.of(iterable)
produitStream<Iterable<Object>>
.Réponses:
Il y a une bien meilleure réponse que d'utiliser
spliteratorUnknownSize
directement, ce qui est à la fois plus facile et obtient un meilleur résultat.Iterable
a unespliterator()
méthode, vous devez donc simplement l'utiliser pour obtenir votre séparateur. Dans le pire des cas, c'est le même code (que l'implémentation par défaut utilisespliteratorUnknownSize
), mais dans le cas le plus courant, où votreIterable
est déjà une collection, vous obtiendrez un meilleur séparateur, et donc de meilleures performances de flux (peut-être même un bon parallélisme). C'est aussi moins de code:Comme vous pouvez le voir, obtenir un flux depuis un
Iterable
(voir aussi cette question ) n'est pas très douloureux.la source
Stream
aurait été bien, par exempleStream.ofIterable(iterable)
.Si vous pouvez utiliser la bibliothèque Guava, depuis la version 21, vous pouvez utiliser
la source
Lists.newArrayList(Iterable)
.Vous pouvez facilement créer un à
Stream
partir d'unIterable
ouIterator
:la source
stream(...)
encombrer votre code?Je voudrais suggérer d'utiliser la bibliothèque JOOL , elle cache la magie du séparateur derrière l'appel Seq.seq (itérable) et fournit également tout un tas de fonctionnalités utiles supplémentaires.
la source
Donc, comme une autre réponse mentionnée, Guava prend en charge cela en utilisant:
Je tiens à souligner que la mise en œuvre fait quelque chose de légèrement différent des autres réponses suggérées. Si le
Iterable
est de type,Collection
il le lance.la source
J'ai créé cette classe:
Je pense que c'est parfaitement lisible car vous n'avez pas à penser aux séparateurs et aux booléens (isParallel).
la source
Une solution de contournement très simple pour ce problème consiste à créer une
Streamable<T>
extension d'interface contenantIterable<T>
unedefault <T> stream()
méthode.Désormais, n'importe lequel de vos
Iterable<T>
fichiers peut être simplifié en streaming simplement en les déclarant à laimplements Streamable<T>
place deIterable<T>
.la source
Si vous utilisez Vavr (anciennement Javaslang), cela peut être aussi simple que:
la source
Une autre façon de le faire, avec Java 8 et sans bibliothèques externes:
la source