Elixir Language
Stroom
Zoeken…
Opmerkingen
Streams zijn configureerbare, luie opsommingen.
Vanwege hun luiheid zijn streams handig bij het werken met grote (of zelfs oneindige) collecties. Bij het koppelen van veel bewerkingen met Enum
, worden tussentijdse lijsten gemaakt, terwijl Stream
een recept maakt van berekeningen die op een later moment worden uitgevoerd.
Meerdere bewerkingen koppelen
Stream
is vooral handig wanneer u meerdere bewerkingen op een verzameling wilt uitvoeren. Dit komt omdat Stream
lui is en slechts één iteratie uitvoert (terwijl Enum
bijvoorbeeld meerdere iteraties zou doen).
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 hebben we 3 bewerkingen aan elkaar gekoppeld ( map
, filter
en take_every
), maar de laatste iteratie werd pas uitgevoerd nadat Enum.to_list
werd aangeroepen.
Wat Stream
intern doet, is dat het wacht totdat daadwerkelijke evaluatie is vereist. Daarvoor maakt het een lijst van alle functies, maar zodra evaluatie nodig is, doorloopt het één keer de verzameling en worden alle functies op elk item uitgevoerd. Dit maakt het efficiënter dan Enum
, die in dit geval bijvoorbeeld 3 iteraties zou doen.