When in Kotlin
Do not miss this exclusive book on Binary Tree Problems. Get it now for free.
Reading time: 20 minutes
When is one of the control flow of Kotlin. If you are coming from java, When is a bit similar to Switch. Even if you don't know java, think When as powerful nested if else. If you don't know any programming language, then think When as a plain enlglish term WHEN.
It's pretty self-explanatory, Right?
Syntax
Here is syntax
var x = 0
when(x){
0 -> print("I'm Zero")
1 -> print("I'm One")
2, 3 -> println("I might be Two to There")
else -> println("I don't know who I am")
}
Explanation
Here is explanation.
- take a name x and assign an Int value of 0
- when x is
- 0 then show I'm Zero ( or we might said print out I'm Zero )
- when x is 1 then I'm One
- when x is 2 or 3 then I might be Two or Three
- here println is not the same as print
- println means print out as a line then wait at the next line
- print means print out but don't move to next line
- now the last one else, that means none of the above
- In our case when x is not 1, 2 or 3 than else will do his job. Here is just print out I don't know who I am
Round Two
val me = "Whale"
when(me){
"Human" -> println("I'm human, Yayyy!")
"Fox" -> println("I'm Fox, but not Megan Fox")
}
- Above code will not print Anything
- Why ?
- Coz when above code execute nothing matched with the given variable (or immutalbe variable) me.
Let's fix it
val me = "Whale"
when(me){
"Human" -> println("I'm human, Yayyy!")
"Fox" -> println("I'm Fox, but not Megan Fox")
"whale" -> println("I'm whale, but small one")
"Whale" -> println("I'm Whale, but not so small")
}
So what is your guess ?
if you said I'm whale, but small one you are WRONG
you know computer are dumb, so they only know what you teached them to know. Case Sentitive Right?
The answer is I'm Whale, but not so small
but above code have some problem !
change the assign value of me to "Jedi"
here is code
val me = "Jedi"
when(me){
"Human" -> println("I'm human, Yayyy!")
"Fox" -> println("I'm Fox, but not Megan Fox")
"whale" -> println("I'm whale, but small one")
"Whale" -> println("I'm Whale, but not so small")
}
you gonna see nothing, coz we missed none of the above part
(or else).
so when can used not just for Int, String but also for whole other types. boolean, range, char, double, etc etc
Round Three
var howMuchIHave = 0.0
when(howMuchIHave){
0 -> { // Incompatible types: Int and Double at here
print("I have zero")
print("ohh poor me!")
}
0.0 -> {
println("I still don't have money")
println("I have to rob the bank, just kidding")
}
else -> println("How much I have is $howMuchIHave")
}
Above code will print
Incompatible types: Int and Double
you know // means comment right?
the problem here is we are performing different type all together.
here is the fix
var howMuchIHave = 0.0
when(howMuchIHave){
0.0 -> { // Incompatible types: Int and Double at here
print("I have zero")
print("ohh poor me!")
}
0.0 -> {
println("I still don't have money")
println("I have to rob the bank, just kidding")
}
else -> println("How much I have is $howMuchIHave")
}
print out I have zeroohh poor me!
Hummm why? we have two 0.0 but only one print out.
coz we have duplicate label in when
but did you noticed about the difference between print and println
that is progress.
var howMuchIHave = 0.1
when(howMuchIHave){
0.0 -> { // Incompatible types: Int and Double at here
print("I have zero")
print("ohh poor me!")
}
0.1 -> {
println("Something is better than nothing")
println("One small penny for man, one giant leap for me")
}
else -> println("How much I have is $howMuchIHave")
}
now the output is
Something is better than nothing
One small penny for man, one giant leap for me
so here is your task change the var howMuchIHave = 0.1 to
var howMuchIHave = 'a'
comment the output
press me to the kotlin online ide
Round Four
var something = "something"
when(something){
is String -> println("I'm a String")
"something" -> println("My value is something")
else -> println("I'm nothing")
}
here will print out I'm a String
so change the order to above code to
when(something){
"something" -> println("My value is something")
is String -> println("I'm a String")
else -> println("I'm nothing")
}
this time will be My value is something print out
- is keyword check the type of the instance
- code order is important
Round Five
val x = 1101
when(x){
in 0..1 -> println("between 0 and 1")
!in 1100..1101 -> println("not between 1000 and 1111")
in 1100..1101 -> println("between 1100 and 1101")
else -> println("I have no idea at all")
}
above code will print out between 1100 and 1101
- .. is called Range operator in kotlin
- in 0..1 means between 0 and 1
- !in means not in
- so !in 1100..1101 means not between 1100 and 1101
Round Six
val number = 2
when{
number.isEven() -> prinltn("Even number")
number.isOdd() -> println("Odd number")
else -> println("error")
}
here, we used when liked if else
Round Seven
var responseCode = 400
val errorMessage = when(responseCode){
200 -> "Ok"
201 -> "Created"
203 -> "Non-Authoritative Information"
400 -> "Bad Request"
403 -> "Forbidden"
500 -> "Internal Server Error"
else -> "Unknown Error"
}
println("HTTP Status Code is $responseCode and result is $errorMessage")
The output is HTTP Status Code is 400 and result is Bad Request
When responseCode is something that match within my code I'll take that value and passed to variable named errorMessage.
What important is when you used when liked that, don't forget the else part. change the responseCode to 501 and
remove or comment else -> "Unknown Error sentence.
Run it.
Comment your output
Sign up for FREE 3 months of Amazon Music. YOU MUST NOT MISS.