[Java] Java 8 มาเขียน Lambda และใช้ syntax ใหม่ ๆ กันเถอะ
เรื่องเริ่มจาก Android N และ Android Studio 2.1 Preview ก็ต่างประกาศออกมาว่าจะรองรับ Java 8 ซักที ก็เลยนึกขึ้นได้ว่ามีอีกเรื่องที่อยากจะเขียน แต่ในบทความนี้น่าจะหนักไปทาง Java Programming มากกว่า ซึ่งใน version 8 นี้ก็มี syntax ใหม่ๆ เข้ามา ใกล้เคียงความเป็น Functional Language มากขึ้น
Java 8 (JDK 8) มีอะไรเพิ่มมาหลายๆอย่าง ซึ่งทำให้เราเขียนอะไรๆได้สั้นลง ซึ่งมี syntax ที่เราจะต้องเรียนรู้เพิ่มเติม หลักๆ คือ Lambda Expression, Method Reference, Stream&Filter โดยสามารถอ่านทั้งหมดได้ที่ >> What's New in JDK 8
จากตัวอย่างเราสามารถใช้ Lambda แทน Anonymous Class และใช้ Method Reference แทน Lambda ซึ่งการทำลักษณะนี้ เราจะใช้ได้กับการทำ function ต่ออีกทีหนึ่งเพียง function เดียว ซึ่ง parameter type ที่จะสามารถรับ Method Reference ได้จะต้องเป็น
Java 8 มีความสามารถของ functional language เพิ่มเข้ามา ช่วยให้เขียนโปรแกรมง่ายขึ้น แต่จะทำให้ Readability ลดลง สำหรับผมผมคิดว่า Lambda กับ Stream นี่พอรับได้นะ แต่ Method Reference นี่เล่นเอางงเหมือนกัน ความรู้สึกเหมือนสมัยหัดใช้ pointer ในภาษา C ต้องใช้งานไปซักพักถึงจะเข้าที่เข้าทาง ไว้เข้าใจครบสูตรแล้ว จะมาเล่าให้ฟังกันนะครับ
ref.
http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html
Java 8 (JDK 8) มีอะไรเพิ่มมาหลายๆอย่าง ซึ่งทำให้เราเขียนอะไรๆได้สั้นลง ซึ่งมี syntax ที่เราจะต้องเรียนรู้เพิ่มเติม หลักๆ คือ Lambda Expression, Method Reference, Stream&Filter โดยสามารถอ่านทั้งหมดได้ที่ >> What's New in JDK 8
Lambda Expression & Anonymous Class
Anonymous Class (<JDK 8)Thread thread = new Thread(new Runnable() { @Override public void run() { //Do something } });Lambda Expression (JDK 8) เราจะใช้แทน Anonymous Class ที่มี method ที่บังคับโดยใช้เป็นสัญลักษณ์ arrow (->) แทนการ override method ซึ่งเราจะกำหนดจำนวน parameter ให้ตรงกัน แน่นอนว่าถ้ามีหลาย method ที่จำนวน parameter เท่ากันจะไม่สามารถใช้งานได้
Thread thread = new Thread(() -> { //Do something });คราวนี้เราจะมาลองเล่นกับ List กันดูบ้าง
List numbers = Arrays.asList(1, 2, 3, 4, 5, 6); for (int num : numbers) { System.out.println(num); }ตัวอย่างก่อนหน้า เป็นวิธีที่เคยคุ้นเคย เราเคยเรียกวิธีการแบบนี้ว่า for-each แต่หลังจากนี้เราจะมาคุ้นเคยกับ Lambda Expression ซึ่งใน List จะมี method ชื่อ forEach ซึ่งทำงานแบบเดียวกันแต่เขียนไม่เหมือนกัน เอาให้สับสนกันไป
numbers.forEach(num -> System.out.println(num));และยังสามารถเขียนแบบ Method Reference ได้ด้วย
numbers.forEach(System.out::println);Method Reference เป็นความสามารถ เป็น syntax ที่มาใหม่ใน Java 8
จากตัวอย่างเราสามารถใช้ Lambda แทน Anonymous Class และใช้ Method Reference แทน Lambda ซึ่งการทำลักษณะนี้ เราจะใช้ได้กับการทำ function ต่ออีกทีหนึ่งเพียง function เดียว ซึ่ง parameter type ที่จะสามารถรับ Method Reference ได้จะต้องเป็น
@FunctionalInterface
Stream & Filter
ความสามารถนี้จะช่วยให้เราลดการเขียน loop และทำ filter ด้วย if-else เอง โดยใช้ลักษณะ chaining methodSystem.out.println( numbers.stream() .filter(num -> num % 2 == 0) .collect(Collectors.toList()) );ตัวอย่างนี้เป็นการเลือกตามเงื่อนไข num % 2 == 0 หรือก็คือเอาเฉพาะเลขคู่ ซึ่งเราสามารถใช้ลูกเล่นของ stream ได้หลากหลายกว่านี้มาก
Java 8 มีความสามารถของ functional language เพิ่มเข้ามา ช่วยให้เขียนโปรแกรมง่ายขึ้น แต่จะทำให้ Readability ลดลง สำหรับผมผมคิดว่า Lambda กับ Stream นี่พอรับได้นะ แต่ Method Reference นี่เล่นเอางงเหมือนกัน ความรู้สึกเหมือนสมัยหัดใช้ pointer ในภาษา C ต้องใช้งานไปซักพักถึงจะเข้าที่เข้าทาง ไว้เข้าใจครบสูตรแล้ว จะมาเล่าให้ฟังกันนะครับ
ref.
http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html
https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html