Elixir Language
Strumień
Szukaj…
Uwagi
Strumienie to składane, leniwe wyliczenia.
Ze względu na lenistwo strumienie są przydatne podczas pracy z dużymi (a nawet nieskończonymi) kolekcjami. Podczas łączenia wielu operacji za pomocą Enum
tworzone są listy pośrednie, podczas gdy Stream
tworzy przepis obliczeń, które są wykonywane w późniejszym czasie.
Łączenie wielu operacji
Stream
jest szczególnie przydatny, gdy chcesz uruchomić wiele operacji na kolekcji. Wynika to z faktu, że Stream
jest leniwy i wykonuje tylko jedną iterację (podczas gdy Enum
wykonuje na przykład wiele iteracji).
numbers = 1..100
|> Stream.map(fn(x) -> x * 2 end)
|> Stream.filter(fn(x) -> rem(x, 2) == 0 end)
|> Stream.take_every(3)
|> Enum.to_list
[2, 8, 14, 20, 26, 32, 38, 44, 50, 56, 62, 68, 74, 80, 86, 92, 98, 104, 110,
116, 122, 128, 134, 140, 146, 152, 158, 164, 170, 176, 182, 188, 194, 200]
Tutaj take_every
3 operacje ( map
, filter
i take_every
), ale ostatnia iteracja została wykonana dopiero po Enum.to_list
.
Stream
wykonuje wewnętrznie to, że czeka, aż wymagana będzie rzeczywista ocena. Wcześniej tworzy listę wszystkich funkcji, ale gdy potrzebna jest ocena, przegląda kolekcję raz, uruchamiając wszystkie funkcje na każdym elemencie. To sprawia, że jest bardziej wydajny niż Enum
, który w tym przypadku wykonałby na przykład 3 iteracje.