Po pierwsze, wszystkie nie są rygorystyczne . Ma to szczególne znaczenie matematyczne związane z funkcjami, ale zasadniczo oznacza, że są one obliczane na żądanie, a nie z góry.
Stream
to rzeczywiście leniwa lista. W rzeczywistości w Scali a Stream
jest, List
którego tail
jestlazy val
. Po obliczeniu wartość pozostaje obliczona i jest ponownie wykorzystywana. Lub, jak mówisz, wartości są buforowane.
Można Iterator
użyć tylko raz, ponieważ jest wskaźnikiem przechodzenia do kolekcji, a nie kolekcją samą w sobie. To, co czyni go wyjątkowym w Scali, to fakt, że możesz zastosować transformację taką jak map
i filter
i po prostu uzyskać nową, Iterator
która zastosuje te transformacje tylko wtedy, gdy poprosisz o następny element.
Scala dostarczała iteratory, które można zresetować, ale jest to bardzo trudne do utrzymania w sposób ogólny i nie stworzyli wersji 2.8.0.
Widoki mają być przeglądane podobnie jak widok bazy danych. Jest to seria transformacji, którą stosuje się do kolekcji w celu stworzenia kolekcji „wirtualnej”. Jak powiedziałeś, wszystkie transformacje są ponownie stosowane za każdym razem, gdy musisz pobrać z nich elementy.
Zarówno Iterator
widoki, jak i widoki mają doskonałą charakterystykę pamięci. Stream
jest fajny, ale w Scali jego główną zaletą jest pisanie nieskończonych sekwencji (szczególnie sekwencji definiowanych rekurencyjnie). Można jednak uniknąć przechowywania całego the Stream
w pamięci, upewniając się, że nie przechowujesz odniesienia do jego head
(na przykład używając def
zamiast val
definiowania Stream
).
Ze względu na kary, jakie ponoszą widoki, zazwyczaj należy to force
zrobić po zastosowaniu transformacji lub zachować jako widok, jeśli oczekuje się, że tylko kilka elementów zostanie kiedykolwiek pobranych, w porównaniu do całkowitego rozmiaru widoku.