連結多個操作

當你想要對集合執行多個操作時,Stream 特別有用。這是因為 Stream 是懶惰的並且只進行一次迭代(而 Enum 將進行多次迭代,例如)。

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]

在這裡,我們連結了 3 個操作(mapfiltertake_every),但最後的迭代只在 Enum.to_list 被呼叫之後完成。

Stream 內部的作用是等待直到需要進行實際評估。在此之前,它會建立所有函式的列表,但是一旦需要進行評估,它就會經歷一次集合,在每個專案上執行所有函式。這使得它比 Enum 更有效,例如,在這種情況下,Enum 將進行 3 次迭代。