fal*_*con 5 lambda android kotlin rx-android
我正在尝试在android项目中使用kotlin M12,在工作期间我得到了这段代码订阅({onSuccess(it)},{onFailure(it)})
AppObservable.bindActivity(this, api.get(id)).subscribe({onSuccess(it)}, {onFailure(it)})
fun onSuccess(str: String) {}
fun onFailure(tr: Throwable) {}
Run Code Online (Sandbox Code Playgroud)
这不是那么糟糕,但我认为它会/应该更好.我怎样才能改进它?
首先,创建一个这样的辅助扩展方法:
fun<T, R> Observable<T>.subscribe(
receiver: R,
onSuccess: R.(T) -> Unit,
onFailure: R.(Throwable) -> Unit) {
subscribe({ receiver.onSuccess(it) }, { receiver.onFailure(it) })
}
Run Code Online (Sandbox Code Playgroud)
现在你可以像这样使用你的新方法:
AppObservable.bindActivity(this, api.get(id)).subscribe(this, ::onSuccess, ::onFailure)
Run Code Online (Sandbox Code Playgroud)
所述::操作者创建的方法的参考.一旦KT-6947得到解决,我们可以省略辅助方法并subscribe(this::onSuccess, this::onFailure)直接写入.这在Java 8中已经可以实现.
要解决此问题,我们还可以实现以下帮助器方法,将接收器绑定到扩展方法:
fun <T, R, E> T.bind(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
AppObservable.bindActivity(this, api.get(id)).subscribe(bind(Foo::onSuccess), bind(Foo::onFailure))
Run Code Online (Sandbox Code Playgroud)
但这并不比你最初的解决方案更优雅.
EDIT1:
::onSuccess现在禁止使用你的语法,所以你必须使用'Foo :: onSuccess' Foo你的类名.
EDIT2:
通过声明与方法相同的方法,您可以通过运算符重载获得一些乐趣
operator fun <T, R, E> T.plus(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样使用它:
AppObservable.bindActivity(this, api.get(id)).subscribe(this + Foo::onSuccess, this + Foo::onFailure)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
659 次 |
| 最近记录: |