‘when’ operator in Kotlin

when operator is a replacement of ‘switch’ operator in other languages.

var intNumber = 10
when (intNumber) {
1 -> print(“value is 1”)
2 -> print(“value is 2”)
else -> {
print(“value of intNumber is neither 1 nor 2”)
}
}

‘when’ operator matches its argument with all the branches until it matches with anyone, else it executes the ‘else’ block.

This post was originally posted at https://agrawalsuneet.github.io/blogs/when-operator-in-kotlin/ and reposted on Medium on 11th Jan 2018.

It can be used as an expression where the value of the satisfied branch becomes the value of the overall expression.

fun calculateAreaOfCircle(radius: Float): Float {
return (22 * radius * radius) / 7
}
fun calculateAreaOfSquare(sideLength: Float): Float {
return (sideLength * sideLength)
}
fun calculateArea(shape: Shape) : Float {
var area = when (shape) {
is Circle -> calculateAreaOfCircle( radius = 6f)
is Square -> calculateAreaOfSquare(sideLength = 10f)
else -> {
print(“invalid shape”)
return 0f
}
}
//use area for further use
return area
}

in the above example, based on the shape type, the overall expression is replaced with the satisfied branch.

Or it can be used as a statement where the satisfied block’s statements will be performed.

var count = 100
when (count) {
in 0 until 100 -> {
//count is between 1 to 99
count++
}
else -> {
//count is greater than 99
//set it to 0
count = 0
}
}

The else branch is evaluated if none of the other branch conditions is 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

val boolValue : Boolean = false

when (boolValue) {
false -> {
print(“value is false”)
}
true -> {
print(“value is true”)
}
}

The branch conditions may be combined with a comma

val value = 100

when (value) {
0, 1 -> print(“x == 0 or x == 1”)
!in 10..20, !in 30..40 -> {
print(“not in 10 to 20 and 30 to 40”)
}
else -> print(“otherwise”)
}

We can also check a value for being in or !in a range or a collection

 val value = 21
val initialPrimeNumbers = intArrayOf(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47)

when (value) {
in 10..20 -> print(“in 10 to 20”)
!in 30 until 40 -> print(“not in 30 to 39”)
in initialPrimeNumbers -> print(“exist in array”)
else -> print(“not present anywhere”)
}

Another possibility is to check that a value is or !is of a particular type.

val shape : Shape = Circle()

when (shape) {
is Circle -> print(“shape is a Circle class object”)
is Square -> print(“shape is a Square class object”)
else -> {
print(“invalid shape”)
}
}

‘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

val num = 10
when {
isPrime(num) -> print(“num is a prime number”)
isComposite(num) -> print(“num is a composite number”)
else -> {
print(“num is neither prime nor composit”)
}
}

Reference: Kotlin docs

That’s all for now. You can read my other interesting posts here or you can enjoy my games or apps listed here. Feel free to use my open-source Android components in your app listed here. Or drop an email, if you didn’t find what you are looking for and need some help.