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.
Streames una lista perezosa de hecho. De hecho, en Scala, a Streames un Listcuyo tailes a lazy val. Una vez calculado, un valor permanece calculado y se reutiliza. O, como usted dice, los valores se almacenan en caché.
Un Iteratorsolo 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 mapy filtery simplemente obtener una nueva Iteratorque 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 Iteratory las vistas tienen excelentes características de memoria. Streames agradable, pero, en Scala, su principal beneficio es escribir secuencias infinitas (particularmente secuencias definidas recursivamente). Sin embargo, se puede evitar mantener todo Streamen la memoria, asegurándose de no mantener una referencia a su head(por ejemplo, al usar en deflugar de valpara definir el Stream).
Debido a las penalizaciones incurridas por las vistas, generalmente forcese 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.