ป้ายกำกับ: Declarative Programming

Java Stream API 101: การคัดกรอง แปลง และจัดกลุ่มข้อมูลด้วย filter, map, collectJava Stream API 101: การคัดกรอง แปลง และจัดกลุ่มข้อมูลด้วย filter, map, collect

ในโลกของการจัดการข้อมูลขนาดใหญ่ (Big Data) การดึงข้อมูลดิบมาใช้งานมักเป็นความท้าทายหลักสำหรับนักพัฒนาและวิศวกรข้อมูล หากเราต้องเขียนโค้ดเพื่อประมวลผลชุดข้อมูลจำนวนมากด้วยลูปแบบเดิมๆ โค้ดอาจจะยาว ซับซ้อน และยากต่อการดูแลรักษา ทำให้เกิดปัญหาที่เรียกว่า “Imperative Code” ซึ่งเน้นว่า ‘ทำอย่างไร’ ทีละขั้นตอน

สำหรับผู้ที่คุ้นเคยกับแนวคิดของ Java Stream API ที่ใช้การประมวลผลแบบ Pipeline (Filter, Map, Collect) วันนี้เราจะมาเจาะลึกถึงวิธีการบรรลุเป้าหมายเดียวกันแต่ทรงพลังกว่า ภายในระบบจัดการฐานข้อมูล PostgreSQL โดยเปลี่ยนมุมมองจากการเขียนโค้ดเชิงคำสั่ง ไปสู่การประกาศเจตนา (Declarative) ผ่านภาษา SQL ที่มีประสิทธิภาพสูง

PostgreSQL: การประมวลผลแบบ Declarative Data Pipeline

หัวใจสำคัญของการทำงานกับข้อมูลใน PostgreSQL คือความสามารถในการมองชุดข้อมูลเป็น ‘ลำธาร’ ของข้อมูลที่ไหลผ่านกระบวนการต่างๆ ได้อย่างสง่างาม เราไม่จำเป็นต้องเขียนลูปเพื่อวนซ้ำ แต่เราใช้คำสั่ง SQL ที่ถูกออกแบบมาให้จัดการ Flow การประมวลผลทั้งหมด ตั้งแต่การคัดกรอง (Filtering) ไปจนถึงการแปลงรูปแบบและการจัดกลุ่ม (Mapping & Grouping)

1. การคัดกรองข้อมูล (The Filter Concept: WHERE / HAVING)

ใน Stream API เราใช้ filter() เพื่อเลือกองค์ประกอบที่ตรงตามเงื่อนไขเท่านั้น ใน PostgreSQL เราใช้คำสั่ง WHERE clause ซึ่งเป็นกลไกพื้นฐานและทรงพลังที่สุดในการจำกัดชุดข้อมูลให้เหลือเฉพาะแถว (Rows) ที่เราต้องการ

2. การแปลงรูปแบบข้อมูล (The Map Concept: Functions & Casting)

map() คือการเปลี่ยนค่าของแต่ละองค์ประกอบจากชนิดหนึ่งไปอีกชนิดหนึ่ง เช่น String เป็น Integer หรือ Object ที่ซับซ้อนให้เป็น JSON ใน PostgreSQL เราใช้ฟังก์ชันต่างๆ ของ SQL เช่น UPPER(), การแปลงชนิดข้อมูล (Casting: ::text), หรือการดึงค่าเฉพาะจากโครงสร้าง JSON ด้วย ->>

3. การรวบรวมและจัดกลุ่ม (The Collect Concept: GROUP BY & Aggregates)

เมื่อเราต้องการรวบรวมผลลัพธ์สุดท้าย หรือจัดกลุ่มข้อมูลตามหมวดหมู่ เราใช้ GROUP BY ร่วมกับฟังก์ชัน Aggregate เช่น COUNT(), SUM(), และที่สำคัญคือ ARRAY_AGG() ซึ่งทำหน้าที่คล้ายการ ‘collect’ ข้อมูลหลายรายการให้กลายเป็น Array ในคอลัมน์เดียว

SQL

-- ตัวอย่าง: การกรอง (Filter), แปลง (Map) และจัดกลุ่ม (Collect) ข้อมูลพนักงานใน PostgreSQL 16+ 
WITH employees AS (
    SELECT employee_id, department, salary::text AS formatted_salary, 'A' AS status
)
SELECT 
    department,
    COUNT(employee_id) AS total_employees,
    ARRAY_AGG(formatted_salary ORDER BY employee_id) AS salaries_list -- Collect/Group
FROM employees
WHERE salary > 50000 -- Filter: กรองเฉพาะเงินเดือนที่มากกว่า 50,000 
GROUP BY department
ORDER BY total_employees DESC;

จากตัวอย่างข้างต้น เราได้ใช้ WHERE เพื่อคัดกรองข้อมูล (Filter) จากนั้นเราจัดกลุ่มด้วย GROUP BY และรวบรวมรายการเงินเดือนที่ผ่านการแปลงรูปแบบแล้ว (Map/Collect) ให้เป็น Array ในผลลัพธ์สุดท้าย

บทสรุป: พลังของการคิดแบบ Declarative

การทำความเข้าใจแนวคิดของ Stream API ไม่ได้หมายถึงการเขียนโค้ดภาษา Java แต่คือการเปลี่ยนมุมมองในการคิดจาก “ขั้นตอน” (How) ไปสู่ “ผลลัพธ์ที่ต้องการ” (What) ซึ่งเป็นทักษะสำคัญของ Senior Architect การใช้ PostgreSQL ในลักษณะนี้จะช่วยให้โค้ด SQL ของเรามีความกระชับ อ่านง่าย มีประสิทธิภาพสูง และสามารถรองรับการขยายตัวของข้อมูลได้อย่างแท้จริง ทำให้ระบบของคุณทำงานได้รวดเร็วและเชื่อถือได้ในระดับองค์กร