Wygląda na to, że zarówno Iterator, jak i Stream są leniwe i pozwalają zachować powracające elementy do treści twojego serca. Jaka jest różnica między tymi dwoma?Różnica między iteratorem a strumieniem w Scali?
Odpowiedz
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.
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).
- Dlatego należy zawsze określić strumienie używając
def
i nigdy nie umieścić go w zmiennych lokalnych, które mają długi żywot zakresu. - Istnieje również subtelności pisząc funkcje rekurencyjne przy użyciu strumieni
- Nie może być pewne nieoczekiwane zachowanie wynikające z faktu, że Scala
Stream
nie jest leniwy w głowie, jak
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 .
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
- 1. Różnica między strumieniem pamięci a strumieniem filaru
- 2. Różnica między wyliczaniem Java a Iteratorem
- 3. NodeJS: Jaka jest różnica między strumieniem Duplex a strumieniem Transform?
- 4. Różnica między strumieniem strstream i stringami
- 5. Różnica między obiektem a *?
- 6. Różnica między jquery a $
- 7. jaka jest różnica między tym strumieniem akcji a tym wywołaniem funkcji?
- 8. Jaka jest różnica między definicją var i val w Scali?
- 9. Różnica między String [] a i String ... a
- 10. Różnica między DataSource a DataSet
- 11. Różnica między mapą a dyktowaniem
- 12. Różnica między systemem a shell_exec
- 13. Różnica między% 5B% a% 5B0%?
- 14. Różnica między wysokością a tłumaczeniemZ
- 15. Różnica między Redis a kafka
- 16. Różnica między content_main.xml a activity_main.xml?
- 17. Różnica między File.Copy a File.Move
- 18. różnica między __u8 a uint8_t
- 19. Różnica między CCNode a CCLayer?
- 20. Różnica między IPFS a Filecoin?
- 21. Różnica między hash_map a unordered_map?
- 22. Różnica między prędkością a AppFabric
- 23. Różnica między kodowaniem a sortowaniem?
- 24. Różnica między Invoke a DynamicInvoke
- 25. Różnica między WhitespaceTokenizerFactory a StandardTokenizerFactory
- 26. Różnica między DataContractSerializer a XmlSerializer
- 27. Różnica między transakcją a transakcjąScope
- 28. Różnica między dtrtrs a dtrsm
- 29. Różnica między bytearray a listą
- 30. Różnica między nowym a przesłonięciem?
Co się dzieje z pamięcią - czy dostęp do N-tego elementu to czas dostępu O (1) lub O (N)? – ryeguy
@ryeguy To O (n), ponieważ Stream tworzy listę połączoną z wartościami elementów pamięci podręcznej. –
OK, więc jaka jest różnica między Stream a Iterable? –