📜  Elixir-流

📅  最后修改于: 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.