如何改进 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)