302 votes

Pourquoi Stream <T> pas mettre en œuvre Iterable <T> ?

Dans Java 8, nous avons la classe Stream<T>, qui curieusement ont une méthode

Iterator<T> iterator()

Si vous vous attendez à la mise en place de l'interface objet iterable<T>, ce qui nécessite exactement cette méthode, mais ce n'est pas le cas.

Lorsque je veux effectuer une itération sur un Flux de données à l'aide d'une boucle foreach, je dois faire quelque chose comme

public static Iterable<T> getIterable(Stream<T> s) {
    return new Iterable<T> {
        @Override
        public Iterator<T> iterator() {
            return s.iterator();
        }
    };
}

for (T element : getIterable(s)) { ... }

Suis-je manqué quelque chose?

225voto

KennyTM Points 232647

Il y a déjà demandé la même chose sur la liste de diffusion . La raison principale est Itératif a aussi une re-itérable sémantique, tandis que les Flux ne l'est pas.

Je pense que la raison principale est que, Iterable implique la possibilité de réutilisation, alors qu' Stream est quelque chose qui peut seulement être utilisé une fois de plus comme un Iterator.

Si Stream étendu Iterable puis code existant peut-être surpris lorsqu'il reçoit un Iterable qui déclenche une Exceptionle deuxième temps, ils ne for (element : iterable).

176voto

bayou.io Points 3680

Pour convertir un Stream en Iterable , vous pouvez le faire

 Stream<X> stream = null;
Iterable<X> iterable = stream::iterator
 

Passer un Stream à une méthode qui attend Iterable ,

 void foo(Iterable<X> iterable)
 

simplement

 foo(stream::iterator) 
 

Cependant, cela semble probablement drôle; il pourrait être préférable d'être un peu plus explicite

 foo( (Iterable<X>)stream::iterator );
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X