# Kotlin `when`表达式

> 原文： [https://www.programiz.com/kotlin-programming/when-expression](https://www.programiz.com/kotlin-programming/when-expression)

#### 在本文中，您将借助各种示例来了解在 Kotlin 中的`when`结构。

## Kotlin `when`结构

可以认为 Kotlin 中的`when`结构是 [Java `switch`语句](/java-programming/hello-world)的替代。 它求值许多替代方案中的一段代码。

* * *

### 示例：简单`when`表达式

```kt
fun main(args: Array<String>) {

    val a = 12
    val b = 5

    println("Enter operator either +, -, * or /")
    val operator = readLine()

    val result = when (operator) {
        "+" -> a + b
        "-" -> a - b
        "*" -> a * b
        "/" -> a / b
        else -> "$operator operator is invalid operator."
    }

    println("result = $result")
}

```

当您运行程序时，输出将类似于：

```kt
Enter operator either +, -, * or /
*
result = 60
```

上面的程序从用户那里获取输入字符串（建议阅读：[在 Kotlin 中获取用户的字符串输入](/kotlin-programming/input-output#input-string)）。 假设用户输入了`*`。 在这种情况下，对表达式`a * b`求值，并将该值分配给变量`result`。

如果不满足任何分支条件（用户输入`+`，`-`，`*`或`/`除外），则求值`else`分支。

* * *

在上面的示例中，我们使用`when`作为表达式。 但是，使用`when`作为表达式不是强制性的。 例如，

```kt
fun main(args: Array<String>) {

    val a = 12
    val b = 5

    println("Enter operator either +, -, * or /")
    val operator = readLine()

    when (operator) {
        "+" -> println("$a + $b = ${a + b}")
        "-" -> println("$a - $b = ${a - b}")
        "*" -> println("$a * $b = ${a * b}")
        "/" -> println("$a / $b = ${a / b}")
        else -> println("$operator is invalid")
    }
}
```

When you run the program, the output will be something like:

```kt
Enter operator either +, -, * or /
-
12 - 5 = 7

```

此处，`when`不是表达式（`when`的返回值未分配给任何东西）。 在这种情况下，`else`分支不是必需的。

* * *

## 很小的可能性

**将两个或多个分支条件与逗号组合。** 例如，

```kt
fun main(args: Array<String>) {

    val n = -1

    when (n) {
        1, 2, 3 -> println("n is a positive integer less than 4.")
        0 -> println("n is zero")
        -1, -2 -> println("n is a negative integer greater than 3.")
    }
}
```

运行该程序时，输出为：

```kt
n is a negative integer greater than 3.
```

* * *

**检查范围内的值。** 例如，

```kt
fun main(args: Array<String>) {

    val a = 100

    when (a) {
        in 1..10 -> println("A positive number less than 11.")
        in 10..100 -> println("A positive number between 10 and 100 (inclusive)")
    }
}
```

When you run the program, the output will be:

```kt
A positive number between 10 and 100 (inclusive)
```

* * *

**检查值是否为特定类型。**

要在运行时检查值是否为特定类型，我们可以使用[`is`和`!is`运算符](https://kotlinlang.org/docs/reference/typecasts.html)。 例如，

```kt
when (x) {
    is Int -> print(x + 1)
    is String -> print(x.length + 1)
    is IntArray -> print(x.sum())
}

```

* * *

**使用表达式作为分支条件。** 例如，

```kt
fun main(args: Array<String>) {

    val a = 11
    val n = "11"

    when (n) {
        "cat" -> println("Cat? Really?")
        12.toString() -> println("Close but not close enough.")
        a.toString() -> println("Bingo! It's eleven.")
    }
}
```

When you run the program, the output will be:

```kt
Bingo! It's eleven.

```