- 原文地址:From functional Java to functioning Kotlin
- 原文作者:Benjamin Baxter
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:huanglizhuo
- 校對者:atuooo,hanliuxin5
將 @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 的對比。
如果你也在使用 Kotlin 改造或者編寫專案,歡迎在我的 Twitter 下面評論交流你使用 Kotlin 中踩坑填坑經歷。
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。