如何提高kotlin lambda语法?

我试图在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) {} 

这不是那么糟糕,但我认为它应该会更好。 我该如何改进呢?

首先,像这样创建一个辅助扩展方法:

 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得到解决,我们可以省略helper方法,并直接写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)) 

但是这比你最初的解决方案更加优雅。

EDIT1:

你的语法::onSuccess现在是禁止的,所以你必须使用'Foo :: onSuccess',其中Foo是你的类名。

EDIT2:

通过声明与之相同的方法,你可以对运算符重载有一点乐趣

 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)