Elixir - strumienie
Wiele funkcji oczekuje wyliczalnego i zwraca plik listplecy. Oznacza to, że podczas wykonywania wielu operacji z Enum, każda operacja będzie generować listę pośrednią, dopóki nie osiągniemy wyniku.
Strumienie obsługują leniwe operacje w przeciwieństwie do chętnych operacji wyliczeń. W skrócie,streams are lazy, composable enumerables. Oznacza to, że strumienie nie wykonują operacji, chyba że jest to absolutnie potrzebne. Rozważmy przykład, aby to zrozumieć -
odd? = &(rem(&1, 2) != 0)
res = 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
IO.puts(res)
Uruchomienie powyższego programu daje następujący wynik -
7500000000
W powyższym przykładzie 1..100_000 |> Stream.map(&(&1 * 3))zwraca typ danych, rzeczywisty strumień, który reprezentuje obliczenia mapy w zakresie 1..100_000. Nie oceniła jeszcze tej reprezentacji. Zamiast generować listy pośrednie, strumienie tworzą serię obliczeń, które są wywoływane tylko wtedy, gdy przekazujemy źródłowy strumień do modułu Enum. Strumienie są przydatne podczas pracy z dużymi, być może nieskończonymi zbiorami.
Strumienie i wyliczenia mają wiele wspólnych funkcji. Strumienie zapewniają głównie te same funkcje, które zapewnia moduł Enum, który generował listy jako wartości zwracane po wykonaniu obliczeń na wejściowych elementach wyliczalnych. Niektóre z nich są wymienione w poniższej tabeli -
Sr.No. | Funkcja i jej opis |
---|---|
1 |
chunk(enum, n, step, leftover \\ nil) Przesyła strumieniowo wyliczalne fragmenty, zawierające n elementów każdy, gdzie każdy nowy fragment rozpoczyna elementy kroku do wyliczalnego. |
2 |
concat(enumerables) Tworzy strumień, który wylicza każdy wyliczalny w wyliczalnym. |
3 |
each(enum, fun) Wykonuje daną funkcję dla każdego elementu. |
4 |
filter(enum, fun) Tworzy strumień, który filtruje elementy zgodnie z daną funkcją przy wyliczaniu. |
5 |
map(enum, fun) Tworzy strumień, który zastosuje daną funkcję przy wyliczaniu. |
6 |
drop(enum, n) Leniwie upuszcza następne n elementów z wyliczalnych. |