Il semble que Iterator et Stream soient paresseux et vous permettent de continuer à renvoyer des éléments au contenu de votre coeur. Quelle est la différence entre les deux?Différence entre l'itérateur et le flux dans Scala?
Répondre
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.
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).
- Par conséquent, vous devriez toujours définir des flux en utilisant
def
et ne jamais le mettre dans des variables locales qui ont une portée à long terme. - Il y a des subtilités également lors de l'écriture des fonctions récursives à l'aide Streams,
- Il peut y avoir des comportements inattendus résultant du fait que Scala
Stream
est pas paresseux dans sa tête, comme
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.
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
- 1. Quelle est la différence entre Int et Integer dans Scala?
- 2. Différence entre les types existentiels de Scala et le joker de Java par exemple?
- 3. Différence entre sqlreader et
- 4. Différence entre le dictionnaire et Hashtable
- 5. Différence entre un tableau d'octets et MemoryStream
- 6. Quelle est la différence entre le flux de fichiers en C et iostream en C++?
- 7. Quelle est la différence entre le contrôle de flux DTR/DSR et RTS/CTS?
- 8. Différence entre control.Attributes.Add et control.Attributes []
- 9. Différence entre Roles.GetRolesForUser et Roles.Provider.GetRolesForUser?
- 10. Différence entre Gridview et Datagrid dans Asp.net
- 11. Différence entre -Wconversion entre gcc et g ++
- 12. Différence entre NULL et null dans PHP
- 13. Différence entre admin.site.root et admin.site.urls
- 14. Différence entre feature et plugin.xml?
- 15. Différence entre DataGrid et GridView
- 16. Différence entre value et itemvalue
- 17. Différence entre Send.nc et SendMsg.nc
- 18. Différence entre System.Web.Cache et HTTPContext.Curent.Cache
- 19. Différence entre FileStreamResult et FilePathResult?
- 20. Différence entre null? et vide? dans le schéma
- 21. Différence entre le modèle de contrôle et DataTemplate dans WPF
- 22. Différence entre Delegate.Invoke et délégué()
- 23. Différence entre "\ n" et Environment.NewLine
- 24. Différence entre JNLP et JavaFX
- 25. Différence entre DECLARE_DYNAMIC et DECLARE_DYNCREATE?
- 26. Différence entre Session et HttpContext.Current.Session
- 27. Différence entre HTTPContextBase.User et MembershipUser
- 28. Différence entre scanf() et fgets()
- 29. Différence entre "__method__" et "méthode"
- 30. Différence entre BOOST_CHECK_CLOSE et BOOST_CHECK_CLOSE_FRACTION?
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
@ryeguy C'est O (n) car Stream construit une liste chaînée pour mettre en cache les valeurs des éléments. –
OK, alors quelle est la différence entre Stream et Iterable alors? –