Suche…


Bemerkungen

Streams sind komponierbare, faule Enumerables.

Streams sind aufgrund ihrer Faulheit nützlich, wenn Sie mit großen (oder sogar unendlichen) Sammlungen arbeiten. Wenn Sie viele Vorgänge mit Enum verketten, werden Zwischenlisten erstellt, während Stream ein Rezept von Berechnungen erstellt, die zu einem späteren Zeitpunkt ausgeführt werden.

Verketten mehrerer Operationen

Stream ist besonders nützlich, wenn Sie mehrere Vorgänge für eine Sammlung ausführen möchten. Dies liegt daran, dass Stream faul ist und nur eine Iteration durchführt (während Enum beispielsweise mehrere Iterationen Enum würde).

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]

Hier haben wir 3 Operationen verkettet ( map , filter und take_every ), aber die letzte Iteration wurde erst ausgeführt, nachdem Enum.to_list aufgerufen wurde.

Was Stream intern tut, ist, dass er wartet, bis eine tatsächliche Auswertung erforderlich ist. Vorher erstellt es eine Liste aller Funktionen. Sobald eine Auswertung erforderlich ist, wird sie einmal durch die Sammlung geführt und führt alle Funktionen für jedes Element aus. Dies macht es effizienter als Enum , das in diesem Fall beispielsweise 3 Iterationen durchführen würde.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow