gpt4 book ai didi

android - 如何改进 kotlin lambda 语法?

转载 作者:IT老高 更新时间:2023-10-28 13:48:05 25 4
gpt4 key购买 nike

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

这还不错,但我认为它会/应该更好。我该如何改进它?

最佳答案

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

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 中已经成为可能。

要解决这个问题,我们也可以实现以下帮助方法,将接收器绑定(bind)到扩展方法:

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 是你的类名。

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)

关于android - 如何改进 kotlin lambda 语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31155910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com