Stream.gather(Gatherers.windowFixed): หั่นสตรีมเป็นหน้าต่างขนาดคงที่ (Java 24+)
น้องกายEngineering
อยากหั่นล็อกทีละ 100 บรรทัด หรือคำนวณค่าเฉลี่ยเลื่อน — เคยต้องเขียนคอลเลกชันชั่วคราวเองครับ
ตั้งแต่ Java 24 มี Stream Gatherers และคลาสช่วย Gatherers (API) ให้ทำ intermediate แบบหน้าต่างได้ เช่น:
windowFixed(n)— กลุ่มขนาดคงที่ กลุ่มสุดท้ายอาจเล็กกว่า nwindowSliding(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 ของหน้าต่างขนาดใหญ่