Kotlin嵌套时

时间:2019-12-24 14:08:56

标签: 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())
                }

1 个答案:

答案 0 :(得分:1)

容易!但不使用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)

这里的关键是短路。我们尽快返回结果。而且,我们还可以使代码更加平坦和易于理解。