In Scala gibt es eine Stream-Klasse, die einem Iterator sehr ähnlich ist. Das Thema Difference between Iterator and Stream in Scala? bietet einige Einblicke in die Ähnlichkeiten und Unterschiede zwischen den beiden.Anwendungsfälle für Streams in Scala
Sehen, wie man einen Strom benutzt, ist ziemlich einfach, aber ich habe nicht sehr viele übliche Gebrauchfälle, in denen ich einen Strom anstelle anderer Artefakte verwenden würde.
Die Ideen, die ich jetzt haben:
- Wenn Sie brauchen, um den Einsatz einer unendlichen Reihe zu machen. Aber das scheint mir kein gewöhnlicher Anwendungsfall zu sein, daher entspricht es nicht meinen Kriterien. (Bitte korrigieren Sie mich, wenn es üblich ist und ich habe nur einen blinden Fleck)
- Wenn Sie eine Reihe von Daten haben, bei denen jedes Element berechnet werden muss, aber Sie möchten möglicherweise mehrere Male wiederverwenden. Das ist schwach, weil ich es einfach in eine Liste laden könnte, die konzeptionell für einen großen Teil der Entwicklerpopulation einfacher zu folgen ist.
- Vielleicht gibt es eine große Menge von Daten oder eine rechenintensive Serie und es gibt eine hohe Wahrscheinlichkeit, dass die Elemente, die Sie benötigen, nicht alle Elemente besuchen müssen. Aber in diesem Fall wäre ein Iterator eine gute Übereinstimmung, es sei denn, Sie müssen mehrere Suchen durchführen, in diesem Fall könnten Sie auch eine Liste verwenden, auch wenn sie etwas weniger effizient wäre.
- Es gibt eine komplexe Reihe von Daten, die wiederverwendet werden müssen. Auch hier könnte eine Liste verwendet werden. In diesem Fall wären beide Fälle gleichermaßen schwierig zu verwenden und ein Stream wäre besser geeignet, da nicht alle Elemente geladen werden müssen. Aber wieder nicht so üblich ... oder?
Also habe ich irgendwelche großen Verwendungen verpasst? Oder ist es überwiegend eine Entwicklerpräferenz?
Dank
Ein weiterer Unterschied, den ich hinzufügen möchte, ist, dass 'Stream' in seinem Kopfelement niemals faul ist. Der Kopf eines "Stream" wird in evaluierter Form gespeichert. Wenn eine Sequenz benötigt wird, in der kein Element (einschließlich des Kopfes) berechnet wird, bis angefordert, dann ist "Iterator" die einzige Wahl. – Lii
Neben der Faulheit im Kopfelement wertet es auch jedes Element aus, das Sie löschen möchten. zB: '" a "# ::" b "# ::" c "# ::" d "# :: Stream.empy [Zeichenfolge] .drop (3)' wertet "a", "b", " c "und" d ". "d", weil es Kopf wird. – r90t
Interessantes kurzes Beispiel für den Primzahlengenerator.Interessanterweise, wenn ich das in einer einfachen Scala-Konsole erzeuge und dann nach 4000 Primzahlen frage (in der Praxis nicht so viel, habe ich eine alternative Definition, die 100K in weniger als 2 Sekunden erzeugt), stürzt Scala mit einem "GC-Overhead-Limit überschritten" -Fehler ab . –