連結多個操作
當你想要對集合執行多個操作時,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 個操作(map
,filter
和 take_every
),但最後的迭代只在 Enum.to_list
被呼叫之後完成。
Stream
內部的作用是等待直到需要進行實際評估。在此之前,它會建立所有函式的列表,但是一旦需要進行評估,它就會經歷一次集合,在每個專案上執行所有函式。這使得它比 Enum
更有效,例如,在這種情況下,Enum
將進行 3 次迭代。