Elixir - 流



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

与 Enum 的急切操作相反,流支持惰性操作。简而言之,流是惰性的、可组合的可枚举对象。这意味着流只有在绝对需要时才会执行操作。让我们来看一个例子来理解这一点:

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 模块提供的函数相同的函数,这些函数在对输入可枚举对象执行计算后,会生成列表作为返回值。其中一些列在下面的表格中:

序号 函数及其描述
1

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

将可枚举对象分成块进行流式处理,每个块包含 n 个项目,每个新块从可枚举对象的 step 个元素开始。

2

concat(enumerables)

创建一个流,该流枚举可枚举对象中的每个可枚举对象。

3

each(enum, fun)

对每个项目执行给定的函数。

4

filter(enum, fun)

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

5

map(enum, fun)

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

6

drop(enum, n)

惰性地从可枚举对象中删除接下来的 n 个项目。

广告