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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow