When expression
when defines a conditional expression with multiple branches.
It is similar to the switch statement in C-like languages.
Its simple form looks like this.
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> {
print("x is neither 1 nor 2")
}
}
when matches its argument against all branches sequentially
until some branch condition is satisfied.
when can be used either as an expression or as a statement.
If it is used as an expression, the value of the first matching
branch becomes the value of the overall expression. If it is
used as a statement, the values of individual branches are ignored.
Just like with if, each branch can be a block, and its value is the
value of the last expression in the block.
The else branch is evaluated if none of the other branch conditions
are satisfied. If when is used as an expression, the else branch is
mandatory, unless the compiler can prove that all possible cases are
covered with branch conditions, for example, with enum class entries
and sealed class subtypes).
enum class Bit {
ZERO, ONE
}
val numericValue = when (getRandomBit()) {
Bit.ZERO -> 0
Bit.ONE -> 1
// the 'else' clause is not required because all cases are covered
}
To define a common behavior for multiple cases, combine their conditions
in a single line with a comma:
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
You can use arbitrary expressions (not only constants) as branch conditions
when (x) {
s.toInt() -> print("s encodes x")
else -> print("s does not encode x")
}
You can also check a value for being in or !in a range or a collection:
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
Another option is checking that a value is or !is of a particular type.
Note that, due to smart casts, you can access the methods and properties
of the type without any extra checks.
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
when can also be used as a replacement for an if- else if chain.
If no argument is supplied, the branch conditions are simply boolean
expressions, and a branch is executed when its condition is true:
when {
x.isOdd() -> print("x is odd")
y.isEven() -> print("y is even")
else -> print("x+y is odd")
}
You can capture when subject in a variable using following syntax:
fun Request.getBody() =
when (val response = executeRequest()) {
is Success -> response.body
is HttpError -> throw HttpException(response.status)
}
The scope of variable introduced in when subject is restricted to the
body of this when.
Kotlin Simple Function Program
fun callMe() {
println("Printing from callMe() function.")
println("This is cool (still printing from inside).")
}
fun main(args: Array<String>) {
callMe()
println("Printing outside from callMe() function.")
}