From functional Java to functioning Kotlin

21-Dec-17

คัมภีร์เทพ IT

See the original english version Click here!

 

ปัจจุบันภาษา Kotlin ถือเป็นภาษาที่เกิดขึ้นใหม่ ถูกพูดถึงและดูจะเริ่มเป็นที่นิยมใช้กันมากขึ้น และด้วยความที่เป็นภาษาใหม่ มันจึง support การทำงานร่วมกับภาษา Programming ที่ใช้กันอยู่ในปัจจุบันด้วย โดยเฉพาะอย่างยิ่ง กับภาษายอดนิยมอย่าง Java วันนี้ทีมงาน TechStar ได้นำบทความของคุณ Benjamin Baxter (Developer Programs Engineer ที่ Google) ซึ่งเป็นเรื่องเกี่ยวกับ Function ที่ใช้ Convert code จาก Java ไปเป็น Kotlin มาให้อ่านกัน ดังนี้ครับ

Java 8 ได้มีการแนะนำการใช้งานใหม่ที่เรียกว่า @FunctionalInterface ขึ้นมา โดยมีจุดประสงค์เพื่อให้สามารถสร้าง Interface กับ Non-default method โดยให้ Interface สามารถจำลอง function เป็น First class citizens ใน Object Oriented Language ได้ อย่างเช่น “Comparable” เป็น @FunctionalInterface กับ method “compareTo (T o)

การใช้ Callbacks ถือเป็นกรณีทั่วไปสำหรับ functional interfaces ซึ่งคุณสามารถลองดูตามสถานการณ์จำลองต่อไปนี้ โดยที่เราต้องการแสดงการทำงานแบบ asynchronous work และ return ผลลัพธ์ไปยัง client ในภายหลัง ซึ่งใน Java เราจะมี class ที่มีลักษณะดังนี้:

public class MyAwesomeAsyncService {
   
    @FunctionalInterface
    public interface AwesomeCallback {
        void onResult(Result result);
    }
    private final AwesomeCallback callback;
   
    public MyAwesomeAsyncService(AwesomeCallback callback) {
        this.callback = callback;
    }
    public void doWork() {
        ...
        callback.onResult(result);
    }
}

เราใช้ callback interface ที่มีหนึ่ง method ซึ่ง client code จะต้องมีการ implement

ในขณะที่การใช้ Kotlin converter ใน Android Studio นั้น จะไม่ optimize การ convert @FunctionalInterface ใดๆ

class MyAwesomeAsyncService(private val callback: AwesomeCallback) {
   
    @FunctionalInterface
    interface AwesomeCallback {
        fun onResult(result: Result)
    }
    fun doWork() {
        ...
        callback.onResult(result)
    }
}

Converter ทำการสร้าง interface แบบ 1-1 แต่คำถามคือ มันจะสามารถ optimize ในภายหลังได้หรือไม่? ใน Kotlin เองมีแนวคิดหนึ่งที่ เรียกว่า SAM หรือ Single Abstract Method ซึ่งนี่คือ @FunctionalInterface ที่มีอยู่ใน Java 8 แต่ในส่วนของ document นั้น ไม่ได้มีตัวอย่างของวิธีการสร้าง SAM ไว้ให้ มีแต่เฉพาะวิธีการใช้ SAM เท่านั้น

หลังจากที่ convert ตัว interface ไปเป็น function ใน constructor แล้ว ตัว boilerplate code ที่อยู่รอบ @FunctionalInterface จะมีจำนวน characters จาก 96 characters เหลือเพียงแค่ 38 characters เท่านั้น ซึ่งหมายถึงว่า มี Code ลดลงถึง 40%

class MyAwesomeAsyncService(private val onResult: (Result) -> Unit) {
    
    fun doWork() {
        ...
        onResult(result)
    }
}

เมื่อเปรียบเทียบก่อนและหลังแล้ว คุณจะเห็นได้ว่า Code เหล่านั้นมันลดลง และถูกทำให้ใช้งานได้ง่ายขึ้นด้วย Kotlin ได้อย่างไร ดังตัวอย่างตามรูป

ที่มาmedium.com

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

 

เพิ่มเพื่อน

 

 

 

บทความที่เกี่ยวข้อง