Kotlin 嵌套时

标签 kotlin

我有下一个代码。正如您所看到的,有 3 个 when 一个在另一个内。是否可以扁平化这段代码?我正在考虑一些包装,但无法得到它。目前,我看到的唯一解决方案是将每个时间移动到fun,例如processFirstWhen等。也许有一个更干净的解决方案。任何帮助表示赞赏。

when (val result = callback.invoke()) {
            is DataCompletable.Success -> DomainCompletable.Success
            is DataCompletable.Error ->
                when (result.error) {
                    is DataError.Unauthorized ->
                        when (tokenMixIn.refresh()) {
                            is DomainCompletable.Success -> execute(
                                currentNumberOfRetries + 1,
                                callback
                            )
                            is DomainCompletable.Error -> DomainCompletable.Error(DomainError.RefreshFailed)
                        }
                    else -> DomainCompletable.Error(result.error.mapToDomain())
                }

最佳答案

简单!但不使用when

我想用 if 的扁平层次结构来替换它。

像这样:

val result = callback.invoke()
if(result is DataCompletable.Success) return DomainCompletable.Success
val error = result.error
if(error !is DataError.Unauthorized) return DomainCompletable.Error(result.error.mapToDomain())
val refreshResult = tokenMixIn.refresh()
if(refreshResult is DomainCompletable.Error) return DomainCompletable.Error(DomainError.RefreshFailed)
execute(currentNumberOfRetries + 1, callback)

这里的关键方面是短路。我们尽快返回结果。而且我们还实现了更扁平、更容易理解的代码。

关于Kotlin 嵌套时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59470003/

相关文章:

android - 多次调用分页库中的回调

android - 为什么我不能在Kotlin中将Class类型用作通用参数?

android - 对于 204 无内容响应,Retrofit2 在 kotlin 中返回 null Unit

android - OnBindViewHolder 更新自动滚动到顶部

Kotlin:使用 parcelize 时的构造函数

java - Kotlin 语法困惑 : fun Foo. bar() = (...)

kotlin - 用于 lateinit Int 值的 Kotlin 类型

android - 403 禁止。我们计算的请求签名与您提供的签名不匹配。检查从 Android 到 Amazon S3 的 key 和签名方法

android - invalidateOptionsMenu() 已弃用

android - 如何获取 Android Slices 的彩色文本?