能否用Kotlin Lambda替代单抽象方法抽象类的实例化?
当然可行啦!Kotlin的高阶函数和函数式接口特性,正好能帮你摆脱匿名内部类的繁琐写法,直接用Lambda搞定。我给你两种实用的方案,按需选择就行:
方案一:工厂函数包装(不修改原有抽象类)
如果不想改动已经写好的APIResponseObserver抽象类,我们可以写一个高阶函数工厂,把Lambda转换成APIResponseObserver实例:
首先先确认你的抽象类大概是这样(其他方法已经实现了集中处理逻辑):
abstract class APIResponseObserver<T> : Observer<T> { override fun onSubscribe(d: Disposable) { // 你的订阅时集中处理逻辑 } override fun onError(e: Throwable) { // 你的集中错误处理逻辑 } override fun onComplete() { // 你的完成时逻辑 } // 仅onNext需要自定义实现 abstract override fun onNext(t: T) }
然后创建工厂函数:
// 定义一个顶层函数或者放在合适的工具类里 fun <T> apiObserver(onNextAction: (T) -> Unit): APIResponseObserver<T> { return object : APIResponseObserver<T>() { override fun onNext(t: T) { onNextAction(t) } } }
现在使用的时候就可以直接传Lambda了,再也不用写object :和override fun:
// 之前的繁琐写法 apiService.fetchSomeData() .subscribe(object : APIResponseObserver<Boolean>() { override fun onNext(t: Boolean) { // 处理返回结果 } }) // 简化后的写法 apiService.fetchSomeData() .subscribe(apiObserver { result -> // 直接写结果处理逻辑即可 })
方案二:改用函数式接口(更简洁)
如果你的架构允许修改APIResponseObserver的定义,把它改成Kotlin的函数式接口(fun interface,Kotlin 1.4及以上支持),就能直接享受SAM转换,连工厂函数都不用写:
修改后的接口:
fun interface APIResponseObserver<T> : Observer<T> { // 仅保留需要自定义的onNext作为抽象方法 override fun onNext(t: T) // 其他方法用默认实现写好集中处理逻辑 override fun onSubscribe(d: Disposable) { // 订阅时的集中处理 } override fun onError(e: Throwable) { // 集中错误处理 } override fun onComplete() { // 完成时逻辑 } }
现在使用时可以直接传入Lambda,RxJava的subscribe方法会自动把Lambda转换成APIResponseObserver实例:
apiService.fetchSomeData() .subscribe { result -> // 直接写onNext的处理逻辑,极致简洁 }
小提示
- 方案一适合不想改动现有代码的场景,兼容性更好;
- 方案二更简洁,是Kotlin推荐的函数式编程风格,只要你的项目Kotlin版本在1.4以上就可以用。
内容的提问来源于stack exchange,提问作者Sira Lam
相关产品推荐
相关产品推荐

