Elixir Language
ruscello
Ricerca…
Osservazioni
Gli stream sono componibili, pigri enumerabili.
A causa della loro pigrizia, i flussi sono utili quando si lavora con collezioni grandi (o addirittura infinite). Quando si concatenano molte operazioni con Enum
, vengono creati elenchi intermedi, mentre Stream
crea una ricetta di calcoli che vengono eseguiti in un secondo momento.
Concatenare più operazioni
Stream
è particolarmente utile quando si desidera eseguire più operazioni su una raccolta. Questo perché Stream
è pigro e fa solo un'iterazione (mentre Enum
farebbe più iterazioni, per esempio).
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]
Qui, abbiamo incatenato 3 operazioni ( map
, filter
e take_every
), ma l'iterazione finale è stata eseguita solo dopo che Enum.to_list
stato chiamato.
Quello che Stream
fa internamente, è che attende fino a quando è richiesta una valutazione effettiva. Prima di ciò crea una lista di tutte le funzioni, ma una volta che la valutazione è necessaria, passa attraverso la raccolta una volta, eseguendo tutte le funzioni su ogni elemento. Questo lo rende più efficiente di Enum
, che in questo caso farebbe 3 iterazioni, per esempio.