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 รายการถัดไปอย่างเกียจคร้านจากตัวนับ |