从Kotlin中的“时间陈述”(例如继续或中断)中逃脱

时间:2019-02-20 11:21:34

标签: kotlin control-flow

我有一段代码如下:

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也可以,但同样也不是很优雅)

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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 :(得分:1)

如果您重写条件,则可以摆脱现在拥有Unit

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