Il semble que les deux Itérateur et de Flux sont paresseux et vous permettent de garder le retour d'éléments au contenu de votre coeur. Quelle est la différence entre les deux?
Réponses
Trop de publicités?Flux memoises et Itérateur n'est pas. Vous pouvez parcourir le même cours d'eau plusieurs fois et obtenir le même résultat à chaque fois. Itérateur, d'autre part, ne peut être traversé à la fois.
Ils sont à la fois des constructions pour accéder à un élément en cours, avoir un encore inconnu de la liste des éléments restants (les paresseux de la queue).
Iterator
il est impératif de construire que vous pouvez parcourir seulement une fois.
Stream
fonctionnel de construire. En théorie, vous pouvez traverser à plusieurs reprises (et comme d'autres l'ont mentionné, il ne sera pas recalculer le déjà calculés pièces), mais dans la pratique, car les Ruisseaux sont soit infini ou très grand (c'est pourquoi vous l'utilisez en premier lieu), la tenue de référence pour le jet n'a pas beaucoup de sens (de l'exécution dans la Mémoire assez facile).
- Par conséquent, vous devez toujours définir les flux en utilisant
def
et de ne jamais le mettre dans des variables locales qui ont une longue durée de vie étendue. - Il y a aussi des subtilités lors de la rédaction de fonctions récursives à l'aide de Flux,
- Il peut y avoir un comportement imprévu résultant du fait que Scala
Stream
n'est pas paresseux dans sa tête, comme
En général, il est plus sûr à l'esprit pour éviter de plain Stream
s. Des Alternatives sont à l'aide de EphemeralStream
de Scalaz qui auto-oublie unreferred pièces à l'aide de références faibles, ou à l'aide de Iteratees (voir aussi ici) ou quelque chose de similaire.
Ce fil à la Scala liste de diffusion va dans le détail pour répondre à votre question. Pour extrait la partie la plus pertinente, Tony Morris dit:
L'un est pur, l'autre est impératif (Itérateur). Vous remarquerez peut-être que Itérateur.la prochaine est le côté-accomplissement. Imaginez changer sa méthode à de retour d'un tuple contenant un Itérateur au lieu de cela. c'est à dire au lieu de retourner un T (pour Itérateur[T]), elle renvoie un (T, Itérateur[T]).
Que faisons-nous maintenant? Un flot! prochaine._1 est à la tête et à la prochaine._2 est la queue.
Une meilleure question pourrait être: "pourquoi s'embêter avoir des Itérateurs (ou l'impératif constructions)?". Je soupçonne que la réponse a quelque chose à voir avec Java et cibler la JVM, c'est à dire un défaut de prémisse.