避免 kotlin 中“When”中的 else 条件

Cod*_*ife 9 kotlin kotlin-when

根据When in Kotlin 的文档,如果编译器知道所有值都被覆盖,则 else 不是强制性的。对于 emum 或密封类来说这是非常重要的,但是对于数字 1 到 5 的数组(startRating)如何做到这一点。

private fun starMapping(startRating: Int): String {

    return when (startRating) {
        1 -> "Perfect"
        2 -> "Great"
        3-> "Okay"
        4-> "Bad"
        5-> "Terrible"
        // don't want to add else as I believe it is prone to errors.
    }
}
Run Code Online (Sandbox Code Playgroud)

与此类似的东西

return when (AutoCompleteRowType.values()[viewType]) {
        AutoCompleteRowType.ITEM -> ItemView(
                LayoutInflater.from(parent.context).inflate(R.layout.item_venue_autocomplete_item_info, parent, false))

        AutoCompleteRowType.SECTION -> SectionView(
                LayoutInflater.from(parent.context).inflate(R.layout.item_venue_autocomplete_section, parent, false)
        )
    }
Run Code Online (Sandbox Code Playgroud)

Ser*_*gey 13

usingwhen语句在使用 int 的情况下不可能排除子句,因为编译器不知道如果不在 1..5 范围内else则返回什么。startRating例如,IllegalStateException如果值不在所需范围内,您可以抛出异常:

private fun starMapping(startRating: Int): String {
    return when (startRating) {
        1 -> "Perfect"
        2 -> "Great"
        3-> "Okay"
        4-> "Bad"
        5 -> "Terrible"
        else -> throw IllegalStateException("Invalid rating param value")
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以这样做:

return when {
    startRating <= 1 -> "Perfect"
    startRating == 2 -> "Great"
    startRating == 3 -> "Okay"
    startRating == 4 -> "Bad"
    else -> "Terrible"
}
Run Code Online (Sandbox Code Playgroud)

else条款是必需的。