链接多个操作
当你想要对集合运行多个操作时,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 次迭代。