[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

Popular post of 7 days

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

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

[Android] เปิดเครื่องไม่ได้ โลโก้ค้าง (Boot Loop)