逃离Kotlin的When-Statement(如继续或休息)

问题描述 投票:1回答:3

我有一段代码如下:

when {
        dateFrom == null && dateTo == null -> Unit
        dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
        dateTo != null -> params["lastUpdated"] = ",$dateTo"
        else -> params["lastUpdated"] = "$dateFrom,$dateTo"
    }

我可以像when一样在循环中逃离continue吗?

我现在正在使用dateFrom == null && dateTo == null -> Unit,但这不是很优雅。 (dateFrom == null && dateTo == null -> True也有可能,但同样,不是很优雅)

kotlin control-flow
3个回答
1
投票

你的else部分将永远不会成功,因为前3个条件中的1个将是true。 所以你的代码等同于:

when {
    dateFrom == null && dateTo == null -> Unit
    dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null -> params["lastUpdated"] = ",$dateTo"
}

最后这个:

when {
    dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null -> params["lastUpdated"] = ",$dateTo"
    else -> Unit
}

我想也许你想拥有:

when {
    dateFrom != null && dateTo != null -> params["lastUpdated"] = "$dateFrom,$dateTo"
    dateFrom != null -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null -> params["lastUpdated"] = ",$dateTo"
}

如果这是您想要的,那么就没有进一步简化的情况。


2
投票

没有直接的方法可以做到这一点。作为返回Unit的替代方法,在这种情况下看起来很好,你可以在一个范围内联函数调用中包装when语句,如run { ... }use a return@label

run { 
    when {
        dateFrom == null && dateTo == null -> return@run
        /* ... */
    }
}

如果when分支比单个语句更复杂,则此构造可能更有用。


1
投票

如果你改写你的条件,你可以摆脱你现在有Unit的情况

when {
    dateFrom != null && dateTo != null -> params["lastUpdated"] = "$dateFrom,$dateTo"
    dateFrom != null                   -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null                     -> params["lastUpdated"] = ",$dateTo"
}
© www.soinside.com 2019 - 2024. All rights reserved.