Elixir - สตรีม

ฟังก์ชั่นจำนวนมากคาดหวังว่าจะสามารถระบุและส่งกลับ listกลับ. หมายความว่าในขณะที่ดำเนินการหลายอย่างกับ Enum แต่ละการดำเนินการจะสร้างรายการกลางจนกว่าเราจะไปถึงผลลัพธ์

สตรีมสนับสนุนการดำเนินการที่เกียจคร้านตรงข้ามกับการดำเนินการที่กระตือรือร้นโดย enums ในระยะสั้นstreams are lazy, composable enumerables. สิ่งนี้หมายความว่า 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 ซึ่งสร้างรายการเป็นค่าส่งคืนหลังจากดำเนินการคำนวณเกี่ยวกับการแจงนับอินพุต บางส่วนมีรายชื่ออยู่ในตารางต่อไปนี้ -

ซีเนียร์ ฟังก์ชั่นและคำอธิบาย
1

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

สตรีมที่แจกแจงเป็นกลุ่มโดยมี n รายการแต่ละรายการโดยที่แต่ละกลุ่มใหม่จะเริ่มองค์ประกอบขั้นตอนในการแจกแจง

2

concat(enumerables)

สร้างสตรีมที่แจกแจงแต่ละข้อในแบบนับได้

3

each(enum, fun)

เรียกใช้ฟังก์ชันที่กำหนดสำหรับแต่ละรายการ

4

filter(enum, fun)

สร้างสตรีมที่กรององค์ประกอบตามฟังก์ชันที่กำหนดในการแจงนับ

5

map(enum, fun)

สร้างสตรีมที่จะใช้ฟังก์ชันที่กำหนดในการแจงนับ

6

drop(enum, n)

ทิ้ง n รายการถัดไปอย่างเกียจคร้านจากตัวนับ