专栏名称: Android_开发者
目录
相关文章推荐
51好读  ›  专栏  ›  Android_开发者

函数式 Java 到函数式 Kotlin 的转换

Android_开发者  · 掘金  · android  · 2018-01-08 05:01

正文

请到「今天看啥」查看全文


将 @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 前端 后端 区块链 产品 设计 人工智能 等领域,想要查看更多优质译文请持续关注 掘金翻译计划 官方微博 知乎专栏







请到「今天看啥」查看全文