链接多个操作

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