# When in Kotlin

#### kotlin when software engineering

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.

1. take a name x and assign an Int value of 0
2. when x is
3. 0 then show I'm Zero ( or we might said print out I'm Zero )
4. when x is 1 then I'm One
5. when x is 2 or 3 then I might be Two or Three
6. here println is not the same as print
7. println means print out as a line then wait at the next line
8. print means print out but don't move to next line
9. now the last one else, that means none of the above
10. 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")
}

1. Above code will not print Anything
2. Why ?
3. 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 1. is keyword check the type of the instance 2. 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 1. .. is called Range operator in kotlin 2. in 0..1 means between 0 and 1 3. !in means not in 4. 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.