Elixir Language
Ström
Sök…
Anmärkningar
Strömmar är komponerbara, lata antalet.
På grund av deras lathet är strömmar användbara när man arbetar med stora (eller till och med oändliga) samlingar. När man kedjer många operationer med Enum
skapas mellanlistor, medan Stream
skapar ett recept för beräkningar som utförs vid ett senare tillfälle.
Kedja flera operationer
Stream
är särskilt användbart när du vill köra flera operationer på en samling. Detta beror på att Stream
är lat och bara en iteration (medan Enum
gör flera iterationer).
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]
Här kedjade vi 3 operationer ( map
, filter
och take_every
), men den slutliga iterationen gjordes först efter att Enum.to_list
kallades.
Vad Stream
gör internt är att det väntar tills den faktiska utvärderingen krävs. Innan det skapas en lista över alla funktioner, men när utvärdering behövs går den igenom samlingen en gång och kör alla funktioner på varje objekt. Detta gör det mer effektivt än Enum
, som i detta fall till exempel skulle göra tre iterationer.