当前位置: 首页 > 文档资料 > Elixir 中文教程 >

Streams( Streams)

优质
小牛编辑
124浏览
2023-12-01

许多函数都期望枚举并返回一个list 。 这意味着,在使用Enum执行多个操作时,每个操作都将生成一个中间列表,直到我们到达结果。

Streams支持延迟操作,而不是enums的急切操作。 简而言之, streams are lazy, composable enumerables 。 这意味着除非绝对需要,否则Streams不会执行操作。 让我们考虑一个例子来理解这一点 -

odd? = &(rem(&1, 2) != 0)
res = 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
IO.puts(res)

运行上述程序时,会产生以下结果 -

7500000000

在上面给出的示例中, 1..100_000 |》 Stream.map(&(&1 * 3))返回数据类型,即实际流,表示1..100_000范围内的地图计算。 它还没有评估这种表示。 流不构建中间列表,而是构建一系列计算,只有在我们将底层流传递给Enum模块时才会调用这些计算。 在处理大型集合(可能是无限集合)时,流非常有用。

流和枚举有许多共同的功能。 Streams主要提供Enum模块提供的相同功能,它在对输入枚举执行计算后生成Lists作为其返回值。 其中一些列在下表中 -

Sr.No.功能及其描述
1

chunk(enum, n, step, leftover \\ nil)

流可枚举的块,每个包含n个项目,其中每个新块将步骤元素启动到可枚举中。

2

concat(enumerables)

创建一个枚举可枚举中每个可枚举的流。

3

each(enum, fun)

为每个项执行给定的函数。

4

filter(enum, fun)

创建一个根据枚举的给定函数过滤元素的流。

5

map(enum, fun)

创建将在枚举上应用给定函数的流。

6

drop(enum, n)

懒惰地从可枚举中删除下n个项目。