133 votes

Stream, vues et itérateurs

Quelles sont les différences entre les flux, les vues (SeqView) et les itérateurs en Scala ? Voici ce que je comprends :

  • Ce sont toutes des listes de paresseux.
  • Les flux mettent les valeurs en cache.
  • Les itérateurs ne peuvent être utilisés qu'une seule fois ? Vous ne pouvez pas revenir au début et évaluer à nouveau la valeur ?
  • Les valeurs des vues ne sont pas mises en cache mais vous pouvez les évaluer encore et encore ?

Donc, si je veux économiser de l'espace sur le tas, dois-je utiliser des itérateurs (si je ne vais pas parcourir la liste à nouveau) ou des vues ? Merci.

180voto

Daniel C. Sobral Points 159554

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.

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