2009-10-06 2 views

Antwort

42

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.

+1

In Bezug auf die Memo - wenn ich auf das N-te Element zugreifen, ist die Zugriffszeit O (1) oder O (N)? – ryeguy

+7

@ryeguy Es ist O (n), weil Stream eine verknüpfte Liste zum Zwischenspeichern von Elementwerten erstellt. –

+1

OK, also was ist der Unterschied zwischen Stream und Iterable? –

18

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).

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.

+0

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