เจอคำถามเกี่ยวกับ Java Stream vs For loop ใน facebook group
ถ้าเป็น Java developer/programmer ที่เรียนรู้ความสามารถภาษา Java ใหม่ ๆ
น่าจะใช้ Java stream และ Lambda กันหมดแล้ว
หรือหลาย ๆ คนก็ไปสาย Reactive กันหมดเล้ว
แต่แน่นอนว่า คำถามนี้ก็ยังน่าสนใจ
เพราะว่า ผมก็เจอคำถามแบบนี้บ่อยมาก ๆ
สิ่งที่ต้องพิจารณานั้น ควรดูให้ครบทุกมุมยกตัวอย่างเช่น

  • Readability
  • Performance

เรื่องแรก Performance ของการทำงาน

performance มักจะตรงข้ามกับ readability อย่างมากนั่นคือ

  • กรณีที่ข้อมูลแบบ List ที่มีขนาดไม่ใหญ่มาก For loop จะเร็วกว่า
  • กรณีที่ข้อมูลแบบ List ที่มีขนาดใหญ่ Stream จะเร็วกว่า แถมทำงานแบบ parallel ได้ด้วย ดังนั้นยิ่ง CPU มีหลาย core ยิ่งเร็วขึ้นไปอีก

แต่ที่น่าสนใจคือ JVM สมัยใหม่ตั้งแต่ JDK 1.8 หรือ 8 ขึ้นไป
พยายามทำการ optimize ให้ Stream มีการทำงานที่ดีขึ้นอย่างมาก

อาจจะต้องเลือกว่าcost ของ performance vs cost ของ readability และ maintain อะไรดีกว่ากันในแต่ละบริบทจะต่างกันไป

ลองทำการ benchmark ด้วย JMH (Java Microbenchmark Harness)

เรื่องที่สองคือ readability

ระหว่าง loop ซ้อน loopหรือใน loop
มี if ซ้อน if ไปเรื่อย ๆ
กับใช้งาน Stream ร่วมกับ operation ต่าง ๆ และ Lambda
อะไรน่าจะอ่านและเข้าใจง่ายกว่ากัน
แต่ถ้าปกติก็เริ่มที่ for loop นี่แหละ ง่ายที่สุดแล้ว

จากที่ผมทำงานมาหลัง ๆ ก็ไป Stream กันเลย ตามความเคยชิน !!

ตัวอย่าง code แบบง่าย ๆ
แน่นอนว่า ใช้ for loop เลยง่าย ๆ

แต่ถ้าซับซ้อนกว่าละ !!
ต้องลองกันดูครับแบบนี้อ่านง่ายขึ้นไหม ?

จะแบบไหนลองเลือกดูครับ
แต่ควรต้องรู้และเข้าใจทั้ง for i, for each และ stream
เพื่อให้เราเลือกใช้ได้เหมาะสมครับ

ปล. 1
ตอนนี้ Java 16 แล้วนะครับเรื่อง Java Stream และ Lambda
น่าจะเป็นพื้นฐานของภาษา Java ไปแล้ว
จะใช้งาน for loop หรือ stream ก็ต้องเลือกให้เหมาะสม

ปล. 2
อย่าหนีปัญหาด้วยการเปลี่ยนภาษา เช่นเรายังเขียน Java ต่ำกว่า 1.8 หรือ 8
ดังนั้นเพื่อความ modern เราจะไปภาษา Kotlin เลย !!