2009-10-06 5 views

Répondre

42

Le flux memoises et Iterator ne le fait pas. Vous pouvez traverser le même flux plusieurs fois et obtenir le même résultat à chaque fois. D'autre part, l'itérateur ne peut être traversé qu'une seule fois.

+1

En ce qui concerne la mémoization - si j'accède au Nième élément, est le temps d'accès O (1) ou O (N)? – ryeguy

+7

@ryeguy C'est O (n) car Stream construit une liste chaînée pour mettre en cache les valeurs des éléments. –

+1

OK, alors quelle est la différence entre Stream et Iterable alors? –

18

Ils sont tous deux construits pour accéder à un élément courant, ayant une liste encore inconnue d'éléments restants (la queue paresseuse).

Iterator est une construction impérative que vous ne pouvez traverser qu'une seule fois.

Stream est une construction fonctionnelle. En théorie, vous pouvez le parcourir plusieurs fois (et comme d'autres l'ont mentionné, il ne recalculera pas les parties déjà calculées), mais en pratique parce que les Streams sont infinis ou très grands (c'est pourquoi vous l'utilisez en premier lieu), la référence au flux complet n'a pas beaucoup de sens (vous rencontrez Out Of Memory assez facilement).

En général, il est plus sûr à l'esprit de évitez les plaines Stream s. Les alternatives utilisent EphemeralStream de Scalaz qui oublie automatiquement les parties non-privilégiées en utilisant des références faibles, ou en utilisant Iteratees (voir aussi here) ou something similiar.

+0

Je suis curieux: pourquoi EphemeralStream n'est pas une implémentation par défaut? Vous pouvez toujours reconstruire une partie oubliée de la lignée de données (c'est un langage fonctionnel). Cela ressemble à un gros défaut de conception. – tribbloid

Questions connexes