Побег из оператора «Когда» (например, продолжить или прервать) в Котлине - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть фрагмент кода следующим образом:

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 голосов
/ 20 февраля 2019

Ваша else часть никогда не будет успешной, потому что 1 из 3-х первых условий будет 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"
}

Если этоэто то, что вы хотели, тогда нет дальнейшего упрощения.

0 голосов
/ 20 февраля 2019

Если вы переписываете свои условия, вы можете избавиться от случая, когда у вас есть Unit

when {
    dateFrom != null && dateTo != null -> params["lastUpdated"] = "$dateFrom,$dateTo"
    dateFrom != null                   -> params["lastUpdated"] = "$dateFrom,"
    dateTo != null                     -> params["lastUpdated"] = ",$dateTo"
}
0 голосов
/ 20 февраля 2019

Нет прямого способа сделать это.В качестве альтернативы простому возвращению Unit, который в этом случае выглядит нормально, вы можете заключить оператор when в вызывающий встроенный вызов функции, например run { ... }, а использовать return@label:

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

Эта конструкция может быть более полезной, если ветви when являются более сложными, чем один оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...