Elixir - Luồng

Nhiều hàm mong đợi một giá trị liệt kê và trả về listtrở lại. Nó có nghĩa là, trong khi thực hiện nhiều hoạt động với Enum, mỗi hoạt động sẽ tạo ra một danh sách trung gian cho đến khi chúng ta đạt được kết quả.

Các luồng hỗ trợ các hoạt động lười biếng thay vì các hoạt động háo hức của enums. Nói ngắn gọn,streams are lazy, composable enumerables. Điều này có nghĩa là Luồng không thực hiện một hoạt động trừ khi nó thực sự cần thiết. Chúng ta hãy xem xét một ví dụ để hiểu điều này -

odd? = &(rem(&1, 2) != 0)
res = 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum
IO.puts(res)

Khi chương trình trên được chạy, nó tạo ra kết quả sau:

7500000000

Trong ví dụ ở trên, 1..100_000 |> Stream.map(&(&1 * 3))trả về kiểu dữ liệu, một luồng thực, đại diện cho phép tính bản đồ trong phạm vi 1..100_000. Nó vẫn chưa đánh giá đại diện này. Thay vì tạo danh sách trung gian, các luồng xây dựng một loạt các phép tính chỉ được gọi khi chúng ta chuyển luồng cơ bản đến mô-đun Enum. Luồng rất hữu ích khi làm việc với các tập hợp lớn, có thể là vô hạn.

Luồng và enum có nhiều chức năng chung. Các luồng chủ yếu cung cấp các chức năng tương tự được cung cấp bởi mô-đun Enum đã tạo Danh sách dưới dạng giá trị trả về của chúng sau khi thực hiện tính toán trên các liệt kê đầu vào. Một số trong số chúng được liệt kê trong bảng sau:

Sr.No. Chức năng và mô tả của nó
1

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

Truyền dữ liệu có thể liệt kê theo từng phần, mỗi phần chứa n mục, trong đó mỗi phần mới bắt đầu các phần tử bước vào có thể liệt kê.

2

concat(enumerables)

Tạo một luồng liệt kê từng có thể liệt kê trong một có thể liệt kê.

3

each(enum, fun)

Thực hiện chức năng đã cho cho từng mục.

4

filter(enum, fun)

Tạo luồng lọc các phần tử theo chức năng đã cho trên phép liệt kê.

5

map(enum, fun)

Tạo một luồng sẽ áp dụng hàm đã cho khi liệt kê.

6

drop(enum, n)

Lười biếng làm rơi n mục tiếp theo từ bảng liệt kê.