Primero, todos son no estrictos . Eso tiene un significado matemático particular relacionado con las funciones, pero, básicamente, significa que se calculan a pedido en lugar de por adelantado.
Stream
es una lista perezosa de hecho. De hecho, en Scala, a Stream
es un List
cuyo tail
es a lazy val
. Una vez calculado, un valor permanece calculado y se reutiliza. O, como usted dice, los valores se almacenan en caché.
Un Iterator
solo se puede usar una vez porque es un puntero transversal a una colección, y no una colección en sí misma. Lo que lo hace especial en Scala es el hecho de que se puede aplicar la transformación como map
y filter
y simplemente obtener una nueva Iterator
que sólo se aplicarán estas transformaciones cuando se pide el siguiente elemento.
Scala solía proporcionar iteradores que podrían restablecerse, pero eso es muy difícil de soportar de manera general, y no hicieron la versión 2.8.0.
Las vistas están destinadas a ser vistas como una vista de base de datos. Es una serie de transformación que se aplica a una colección para producir una colección "virtual". Como dijiste, todas las transformaciones se vuelven a aplicar cada vez que necesitas extraer elementos de él.
Ambos Iterator
y las vistas tienen excelentes características de memoria. Stream
es agradable, pero, en Scala, su principal beneficio es escribir secuencias infinitas (particularmente secuencias definidas recursivamente). Sin embargo, se puede evitar mantener todo Stream
en la memoria, asegurándose de no mantener una referencia a su head
(por ejemplo, al usar en def
lugar de val
para definir el Stream
).
Debido a las penalizaciones incurridas por las vistas, generalmente force
se debe aplicar después de aplicar las transformaciones, o mantenerlo como una vista si se espera que solo se recuperen pocos elementos, en comparación con el tamaño total de la vista.