函式式 Java 到函式式 Kotlin 的轉換

Android_開發者發表於2018-01-08

將 @FunctionalInterface 轉換到 Kotlin 中

Java 8 中引入了新的註解 @FunctionalInterface。目的是為建立一個帶有非預設方法的介面,這樣這個介面就可以將函式模擬成面嚮物件語言中的一等公民。比如,Comparable 就是隻帶有一個 compareTo 方法的 @FunctionalInterface

回撥在函式式介面中很常見。想象一下下面的場景,我們想要進行一些非同步操作,稍後將結果返回給呼叫的客戶端。在 Java 中,我們可以建立一個下面這樣的類:

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);
    }
}
複製程式碼

我們使用了有一個方法的回撥介面,呼叫者只需實現它即可。

然而 Android Studio 附帶的 Kotlin 轉換器對 @FunctionalInterface 註解的轉換並不是最優的。

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

轉換結果是建立了一個一對一個轉換介面,但這可以進一步優化嗎? 在 Kotlin 中有個 SAM(Single Abstract Method)單個抽象方法概念。這正是 Java 8 中 @FunctionalInterface 的註解,但在文件中卻沒有建立 SAM 的例子,只講瞭如何使用 SAM。

在建構函式中把介面轉換為函式後,@FunctionalInterface 部分的樣板程式碼從 96 個字元減少到 38 個字元,這可是減少了 40%。

class MyAwesomeAsyncService(private val onResult: (Result) -> Unit) {
    
    fun doWork() {
        ...
        onResult(result)
    }
}
複製程式碼

前後對比過後,你就會體會到 Kotlin 中這些語法糖是多麼的好用。

函式式 Java 到函式式 Kotlin 的轉換

上面的圖片是 Java 轉換為 Kotlin 的對比。

如果你也在使用 Kotlin 改造或者編寫專案,歡迎在我的 Twitter 下面評論交流你使用 Kotlin 中踩坑填坑經歷。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章