Es scheint, dass sowohl Iterator als auch Stream faul sind und Sie Elemente nach Herzenslust zurückgeben können. Was ist der Unterschied zwischen den beiden?Unterschied zwischen Iterator und Stream in Scala?
Antwort
Stream memoises und Iterator nicht. Sie können denselben Stream mehrmals durchlaufen und jedes Mal dasselbe Ergebnis erhalten. Iterator kann dagegen nur einmal durchlaufen werden.
Sie sind beide Konstrukte für den Zugriff auf ein aktuelles Element, mit einer noch unbekannten Liste der verbleibenden Elemente (der Lazy Tail).
Iterator
ist ein imperatives Konstrukt, das Sie nur einmal durchlaufen können.
Stream
ist ein funktionelles Konstrukt. In der Theorie können Sie es mehrfach durchlaufen (und wie andere erwähnt haben, wird es nicht die bereits berechneten Teile neu berechnen), aber in der Praxis, weil Ströme entweder unendlich oder sehr groß sind (deshalb verwenden Sie es an erster Stelle), halten Der Verweis auf den vollständigen Stream macht keinen Sinn (Sie stoßen ziemlich schnell auf Out of Memory).
- Deshalb sollen Sie immer definieren Ströme
def
verwenden und es nie in der lokalen Variablen setzen, die einen langlebigen Umfang haben. - Es gibt Feinheiten auch wenn rekursive Funktionen Schreiben Streams verwenden,
- Es kann einige unerwartete Verhalten aufgrund der Tatsache, sein, dass Scala
Stream
in seinem Kopf nicht faul ist, wie
es in der Regel sicherer, um den Geist zu vermeiden Sie Ebene Stream
s. Alternativen verwenden EphemeralStream
von Scalaz, die nicht erwünschte Teile mit schwachen Referenzen vergisst oder Iteratees (siehe auch here) oder something similiar verwendet.
Ich bin neugierig: Warum EphemeralStream ist keine Standard-Implementierung? Sie können immer vergessene Teile aus der Datenlinie rekonstruieren (es ist eine funktionale Sprache). Das klingt nach einem großen Designfehler. – tribbloid
In Bezug auf die Memo - wenn ich auf das N-te Element zugreifen, ist die Zugriffszeit O (1) oder O (N)? – ryeguy
@ryeguy Es ist O (n), weil Stream eine verknüpfte Liste zum Zwischenspeichern von Elementwerten erstellt. –
OK, also was ist der Unterschied zwischen Stream und Iterable? –