Operador when

Definição

É o substituto do switch-case do Java.

Esse operador é uma expressão, assim como o if-else e ?:.

Não é necessário colocar a palavra reservada break no final de cada branch (como no Java). Além disso, é possível combinar múltiplos valores, separando com vírgula, na mesma branch.

O operador when pode ou não receber um argumento e também é possível declarar uma variável entre os parênteses dele.

Esse operador permite a utilização de in, !in, .. (range), is e de funções.

A branch else é executada quando nenhuma das branches anteriores for satisfeita, é equivalente ao default no Java.

Exemplo

when com argumento:

when (x) {
  1 -> print("x == 1")
  2 -> print("x == 2")
  else -> {
    print("x is neither 1 nor 2")
  }
}

when sem argumento:

when {
  x.isOdd() -> print("x is odd")
  y.isEven() -> print("y is even")
  else -> print("x+y is odd")
}

Branches com funções:

when (x) {
  s.toInt() -> print("s encodes x")
  else -> print("s does not encode x")
}

Branches com verificações de tipos:

fun hasPrefix(x: Any) = when(x) {
  is String -> x.startsWith("prefix")
  else -> false
}

when com declaração de variável:

fun Request.getBody() =
  when (val response = executeRequest()) {
    is Success -> response.body
    is HttpError -> throw HttpException(response.status)
  }