我有下一个代码。正如您所看到的,有 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/