Streams( Streams)
优质
小牛编辑
127浏览
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个项目。 |