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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow