แถวการ์ดตัวเลขถูกจัดเป็นหน้าต่างกลุ่มละสามใบบนโต๊ะมิ้นต์

Stream.gather(Gatherers.windowFixed): หั่นสตรีมเป็นหน้าต่างขนาดคงที่ (Java 24+)

น้องกายEngineering

อยากหั่นล็อกทีละ 100 บรรทัด หรือคำนวณค่าเฉลี่ยเลื่อน — เคยต้องเขียนคอลเลกชันชั่วคราวเองครับ

ตั้งแต่ Java 24 มี Stream Gatherers และคลาสช่วย Gatherers (API) ให้ทำ intermediate แบบหน้าต่างได้ เช่น:

  • windowFixed(n) — กลุ่มขนาดคงที่ กลุ่มสุดท้ายอาจเล็กกว่า n
  • windowSliding(n) — หน้าต่างเลื่อนทีละหนึ่งองค์ประกอบ
  • fold / scan / mapConcurrent — ลดทอน / สะสมคำนำหน้า / แมปพร้อมกันบน virtual threads

ตัวอย่างจากเอกสาร: Stream.of(1..8).gather(Gatherers.windowFixed(3)) ได้ [[1,2,3],[4,5,6],[7,8]]

บล็อกด้านล่างเป็น fragment สำหรับอ่านแนวคิด (ไม่ใช่ suite ที่รันใน CI นี้)

// Conceptual — requires JDK 24+
// List<List<Integer>> windows =
//     Stream.of(1, 2, 3, 4, 5, 6, 7, 8)
//           .gather(Gatherers.windowFixed(3))
//           .toList();

หน้าต่างอาจถูกจัดสรรแบบ eagerly — อย่าเลือก windowSize ใหญ่เกินบนสตรีมเล็กโดยไม่คิด memory

Recap

  • อ่าน Gatherers API
  • ลอง windowFixed กับ batch ล็อกก่อนเขียนบัฟเฟอร์เอง
  • ใช้ windowSliding เมื่อต้องการค่าเฉลี่ยเลื่อน
  • ระวัง memory ของหน้าต่างขนาดใหญ่