如何提高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)
- 从Java转换到Kotlin时出错。 错误 – org.gradle.api.tasks.TaskExecutionException:任务执行失败:app:compileDebugKotlin'
- Kotlin – 具有泛型返回类型的抽象函数
- 在onCreate()中创建的类的Java.lang.VerifyError卡住
- notifyDataChanged()无法更新可扩展列表视图数据
- 以编程方式获取Android中的“屏幕锁定”设置
- 由于重复,Kotlin gradle.build ZipException
- 我应该在使用rxbinding时取消订阅吗?
- Anko的uiThread偶尔没有被解雇
- Kotlin从意图捆绑getParcelableArray不能将其转换为自定义类型
- CapturedTypeConstructor(*)不是RealmModel的子类型
- AccessToken.getCurrentAccessToken()总是在Kotlin中返回null