Premièrement, ils sont tous non stricte . Cela a une signification mathématique particulière liée aux fonctions, mais, fondamentalement, cela signifie qu'elles sont calculées à la demande plutôt qu'à l'avance.
Stream
est une liste paresseuse en effet. En fait, en Scala, une Stream
est un List
dont tail
est un lazy val
. Une fois calculée, une valeur reste calculée et est réutilisée. Ou, comme vous le dites, les valeurs sont mises en cache.
Un Iterator
ne peut être utilisé qu'une seule fois car il s'agit d'un pointeur de traversée dans une collection, et non une collection en soi. Ce qui le rend spécial en Scala est le fait que vous pouvez appliquer des transformations telles que map
y filter
et simplement obtenir un nouveau Iterator
qui n'appliquera ces transformations que lorsque vous demanderez l'élément suivant.
Scala avait l'habitude de fournir des itérateurs qui pouvaient être réinitialisés, mais cela est très difficile à prendre en charge de manière générale, et ils n'ont pas fait la version 2.8.0.
Les vues sont destinées à être visualisées comme une vue de base de données. Il s'agit d'une série de transformations que l'on applique à une collection pour produire une collection "virtuelle". Comme vous l'avez dit, toutes les transformations sont réappliquées chaque fois que vous avez besoin d'en extraire des éléments.
Les deux sites Iterator
et les vues ont d'excellentes caractéristiques de mémoire. Stream
est agréable, mais, en Scala, son principal avantage est d'écrire des séquences infinies (en particulier des séquences définies de manière récursive). Un exemple de puede éviter de conserver tous les Stream
en mémoire, en s'assurant que vous ne gardez pas une référence à son nom. head
(par exemple, en utilisant def
au lieu de val
pour définir le Stream
).
En raison des pénalités encourues par les vues, il faut généralement force
après avoir appliqué les transformations, ou la conserver en tant que vue si l'on s'attend à ce que seuls quelques éléments soient récupérés, par rapport à la taille totale de la vue.