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.
Streamto rzeczywiście leniwa lista. W rzeczywistości w Scali a Streamjest, Listktórego tailjestlazy val . Po obliczeniu wartość pozostaje obliczona i jest ponownie wykorzystywana. Lub, jak mówisz, wartości są buforowane.
Można Iteratoruż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 mapi filteri po prostu uzyskać nową, Iteratorktó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 Iteratorwidoki, jak i widoki mają doskonałą charakterystykę pamięci. Streamjest 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 Streamw pamięci, upewniając się, że nie przechowujesz odniesienia do jego head(na przykład używając defzamiast valdefiniowania Stream).
Ze względu na kary, jakie ponoszą widoki, zazwyczaj należy to forcezrobić 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.