Elixir Language
Strom
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.