[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 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 method
        System.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

Facebook Comment

Recent Posts

Popular post of 7 days

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

Port Forwarding สำหรับคนใช้ AIS Fibre

Popular

Portal คืออะไรกันนะ???

[Java] ความแตกต่างระหว่าง Overloading กับ Overriding

มาตรฐานการตั้งชื่อตัวแปร (Naming Convention)

เรื่องของ ++i กับ i++

Port Forwarding สำหรับคนใช้ AIS Fibre

วิธีการสมัคร Apple Developer Program และ Enterprise Program ฉบับลงมือเอง

ลืมรหัสปลดล็อค Android เข้าเครื่องไม่ได้ มีทางออกครับ

ทดสอบ Mobile App แบบ Automated ด้วย Appium ทำยังไงกันนะ

Deeplink, Universal Links คืออะไร ทำงานร่วมกับ Mobile App ได้ยังไง

Android Auto & Apple Carplay คืออะไร ใช้งานยังไง