2009-10-06 15 views

Odpowiedz

42

Strumień memoises i Iterator nie. Możesz przemierzyć ten sam strumień kilka razy i uzyskać za każdym razem ten sam wynik. Z drugiej strony Iterator może być przemierzany tylko raz.

+1

Co się dzieje z pamięcią - czy dostęp do N-tego elementu to czas dostępu O (1) lub O (N)? – ryeguy

+7

@ryeguy To O (n), ponieważ Stream tworzy listę połączoną z wartościami elementów pamięci podręcznej. –

+1

OK, więc jaka jest różnica między Stream a Iterable? –

18

Są to zarówno konstrukty dostępu do bieżącego elementu, posiadające jeszcze nieznaną listę pozostałych elementów (leniwy ogon).

Iterator jest imperatywną konstrukcją, którą można przemierzać tylko raz.

Stream to konstrukcja funkcjonalna. Teoretycznie możesz przemierzyć go wiele razy (i jak wspomnieli inni, nie będzie to przeliczało już wyliczonych części), ale w praktyce, ponieważ strumienie są albo nieskończone, albo bardzo duże (dlatego używasz go w pierwszej kolejności), trzymając odniesienie do pełnego strumienia nie ma większego sensu (bardzo łatwo można przejść do Out of Memory).

Generalnie jest to bezpieczniejsze dla umysłu unikaj zwykłego Stream s. Rozwiązania alternatywne używają Scalaza, który automatycznie zapominał o nierezydowanych częściach przy użyciu słabych referencji lub używając Iteratees (patrz także here) lub .

+0

Jestem ciekawy: dlaczego EphemeralStream nie jest domyślną implementacją? Zawsze możesz zrekonstruować zapomniany fragment z linii danych (jest to język funkcjonalny). To brzmi jak wielka wada projektu. – tribbloid

Powiązane problemy