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 個專案。

廣告