Erstens sind sie alle nicht streng . Dies hat eine bestimmte mathematische Bedeutung in Bezug auf Funktionen, bedeutet jedoch im Grunde, dass sie bei Bedarf statt im Voraus berechnet werden.
Streamist in der Tat eine faule Liste. Tatsächlich ist in Scala a Streamein, Listdessen a tailist lazy val. Nach der Berechnung bleibt ein Wert berechnet und wird wiederverwendet. Oder, wie Sie sagen, die Werte werden zwischengespeichert.
Ein Iteratorkann nur einmal verwendet werden, da es sich um einen Durchlaufzeiger in eine Sammlung handelt und nicht um eine Sammlung an sich. Das Besondere an Scala ist die Tatsache, dass Sie Transformationen wie mapund anwenden können filterund einfach eine neue erhalten, Iteratordie diese Transformationen nur anwendet, wenn Sie nach dem nächsten Element fragen.
Scala stellte früher Iteratoren bereit, die zurückgesetzt werden konnten, aber das ist im Allgemeinen sehr schwer zu unterstützen, und sie haben Version 2.8.0 nicht erstellt.
Ansichten sollen ähnlich wie eine Datenbankansicht angezeigt werden. Es ist eine Reihe von Transformationen, die man auf eine Sammlung anwendet, um eine "virtuelle" Sammlung zu erzeugen. Wie Sie sagten, werden alle Transformationen jedes Mal neu angewendet, wenn Sie Elemente daraus abrufen müssen.
Beide Iteratorund Ansichten weisen hervorragende Speichereigenschaften auf. Streamist schön, aber in Scala besteht sein Hauptvorteil darin, unendliche Sequenzen zu schreiben (insbesondere Sequenzen, die rekursiv definiert sind). Sie können jedoch vermeiden, den gesamten StreamSpeicher zu behalten, indem Sie sicherstellen, dass Sie keinen Verweis darauf behalten head(z. B. indem Sie das defanstelle von valdefinieren, um es zu definieren Stream).
Aufgrund der Nachteile von Ansichten sollte dies normalerweise forcenach dem Anwenden der Transformationen geschehen oder als Ansicht beibehalten werden, wenn im Vergleich zur Gesamtgröße der Ansicht nur wenige Elemente erwartet werden, die jemals abgerufen werden.