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.