如何改进 kotlin lambda 语法?
How to improve kotlin lambda syntax?
我正在尝试在 android 项目中使用 kotlin M12,在工作期间我得到了这段代码 subscribe({onSuccess(it)}, {onFailure(it)} )
AppObservable.bindActivity(this, api.get(id)).subscribe({onSuccess(it)}, {onFailure(it)})
fun onSuccess(str: String) {}
fun onFailure(tr: Throwable) {}
这还不错,但我认为 would/should 更好。我该如何改进它?
首先,像这样创建一个辅助扩展方法:
fun<T, R> Observable<T>.subscribe(
receiver: R,
onSuccess: R.(T) -> Unit,
onFailure: R.(Throwable) -> Unit) {
subscribe({ receiver.onSuccess(it) }, { receiver.onFailure(it) })
}
现在您可以像这样使用您的新方法了:
AppObservable.bindActivity(this, api.get(id)).subscribe(this, ::onSuccess, ::onFailure)
::
运算符创建方法引用。一旦 KT-6947 得到解决,我们就可以省略辅助方法,直接写 subscribe(this::onSuccess, this::onFailure)
。这在 Java 8.
中已经成为可能
要解决此问题,我们可以选择实现以下将接收器绑定到扩展方法的辅助方法:
fun <T, R, E> T.bind(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
并像这样使用它:
AppObservable.bindActivity(this, api.get(id)).subscribe(bind(Foo::onSuccess), bind(Foo::onFailure))
但这并不比您最初的解决方案更优雅。
编辑 1:
你的语法 ::onSuccess
现在被禁止,所以你必须使用 'Foo::onSuccess' 其中 Foo
是你的 class 名字。
编辑2:
您可以通过声明与
相同的方法来享受运算符重载的乐趣
operator fun <T, R, E> T.plus(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
然后就可以这样使用了:
AppObservable.bindActivity(this, api.get(id)).subscribe(this + Foo::onSuccess, this + Foo::onFailure)
我正在尝试在 android 项目中使用 kotlin M12,在工作期间我得到了这段代码 subscribe({onSuccess(it)}, {onFailure(it)} )
AppObservable.bindActivity(this, api.get(id)).subscribe({onSuccess(it)}, {onFailure(it)})
fun onSuccess(str: String) {}
fun onFailure(tr: Throwable) {}
这还不错,但我认为 would/should 更好。我该如何改进它?
首先,像这样创建一个辅助扩展方法:
fun<T, R> Observable<T>.subscribe(
receiver: R,
onSuccess: R.(T) -> Unit,
onFailure: R.(Throwable) -> Unit) {
subscribe({ receiver.onSuccess(it) }, { receiver.onFailure(it) })
}
现在您可以像这样使用您的新方法了:
AppObservable.bindActivity(this, api.get(id)).subscribe(this, ::onSuccess, ::onFailure)
::
运算符创建方法引用。一旦 KT-6947 得到解决,我们就可以省略辅助方法,直接写 subscribe(this::onSuccess, this::onFailure)
。这在 Java 8.
要解决此问题,我们可以选择实现以下将接收器绑定到扩展方法的辅助方法:
fun <T, R, E> T.bind(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
并像这样使用它:
AppObservable.bindActivity(this, api.get(id)).subscribe(bind(Foo::onSuccess), bind(Foo::onFailure))
但这并不比您最初的解决方案更优雅。
编辑 1:
你的语法 ::onSuccess
现在被禁止,所以你必须使用 'Foo::onSuccess' 其中 Foo
是你的 class 名字。
编辑2:
您可以通过声明与
相同的方法来享受运算符重载的乐趣operator fun <T, R, E> T.plus(reference: T.(R) -> E): (R) -> E = { this.reference(it) }
然后就可以这样使用了:
AppObservable.bindActivity(this, api.get(id)).subscribe(this + Foo::onSuccess, this + Foo::onFailure)