📅  最后修改于: 2020-11-04 08:28:02             🧑  作者: Mango
许多函数都要求可枚举并返回列表。这意味着,在对Enum执行多个操作的同时,每个操作都将生成一个中间列表,直到我们得到结果为止。
流支持惰性操作,而不是枚举的急切操作。简而言之,流是惰性的,可组合的枚举。这意味着除非绝对需要,否则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模块时才被调用。当使用大型(可能无限)的集合时,流非常有用。
流和枚举有许多共同的功能。流主要提供与Enum模块提供的功能相同的功能,该模块在对输入可枚举执行计算后生成List作为其返回值。下表列出了其中一些-
Sr.No. | Function and its Description |
---|---|
1 | chunk(enum, n, step, leftover \\ nil)
Streams the enumerable in chunks, containing n items each, where each new chunk starts step elements into the enumerable. |
2 | concat(enumerables)
Creates a stream that enumerates each enumerable in an enumerable. |
3 | each(enum, fun)
Executes the given function for each item. |
4 | filter(enum, fun)
Creates a stream that filters elements according to the given function on enumeration. |
5 | map(enum, fun)
Creates a stream that will apply the given function on enumeration. |
6 | drop(enum, n)
Lazily drops the next n items from the enumerable. |