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.
Stream
ist in der Tat eine faule Liste. Tatsächlich ist in Scala a Stream
ein, List
dessen a tail
ist lazy val
. Nach der Berechnung bleibt ein Wert berechnet und wird wiederverwendet. Oder, wie Sie sagen, die Werte werden zwischengespeichert.
Ein Iterator
kann 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 map
und anwenden können filter
und einfach eine neue erhalten, Iterator
die 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 Iterator
und Ansichten weisen hervorragende Speichereigenschaften auf. Stream
ist 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 Stream
Speicher zu behalten, indem Sie sicherstellen, dass Sie keinen Verweis darauf behalten head
(z. B. indem Sie das def
anstelle von val
definieren, um es zu definieren Stream
).
Aufgrund der Nachteile von Ansichten sollte dies normalerweise force
nach 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.