When expression as powerful switch in Kotlin - Time & Space Complexity
We want to understand how the time it takes to run a Kotlin when expression changes as we add more cases.
How does checking many conditions affect the program's speed?
Analyze the time complexity of the following code snippet.
fun describeNumber(x: Int): String {
return when (x) {
1 -> "One"
2 -> "Two"
3 -> "Three"
4 -> "Four"
5 -> "Five"
else -> "Unknown"
}
}
This code checks the value of x and returns a matching word or "Unknown" if no match is found.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: No repeating operations; compiler optimizes
whenon integers to a jump table or similar structure. - How many times: Constant time (O(1)) lookup, independent of the number of cases.
The Kotlin compiler translates when expressions with constant integer values into efficient bytecode instructions (like tableswitch), resulting in constant time execution.
| Number of Cases (n) | Approx. Checks |
|---|---|
| 5 | ~1 check |
| 10 | ~1 check |
| 100 | ~1 check |
Pattern observation: Execution time remains constant regardless of the number of cases.
Time Complexity: O(1)
This means the time to find a match stays constant even as you add more cases, thanks to compiler optimizations.
[X] Wrong: "The when expression checks each case sequentially like chained if-else, so it's O(n)."
[OK] Correct: For integer constants, the Kotlin compiler (targeting JVM/JS/Native) uses jump tables or hash-based lookups, making it constant time, not linear.
Understanding compiler optimizations for control structures like when shows deeper knowledge of performance, valued in system design and optimization interviews.
What if the when expression used ranges or types instead of single values? How would that affect the time complexity?
Hint: Ranges may use binary search (O(log n)), but single constants remain O(1). Check bytecode!
Practice
when expression in Kotlin?Solution
Step 1: Understand the role of
Thewhenwhenexpression is used to choose between different actions depending on the value it checks.Step 2: Compare with other options
The other options describe loops, functions, and variables, which are unrelated towhen.Final Answer:
To select actions based on different values, like a switch statement -> Option CQuick Check:
whenchooses actions by value [OK]
when as a smarter switch [OK]- Confusing
whenwith loops - Thinking
whendeclares variables - Mixing
whenwith function definitions
when expression in Kotlin?Solution
Step 1: Identify Kotlin
The correct syntax useswhensyntaxwhen (x) { value -> action }with arrows and braces.Step 2: Check other options
when x { 1: println("One") 2: println("Two") else: println("Other") }uses colons (:) instead of arrows (->) and lacks parentheses.switch (x) { case 1: ... }is Java or JavaScript syntax.if (x == 1) ...is an if-else chain.Final Answer:
when (x) { 1 -> println("One") 2 -> println("Two") else -> println("Other") } -> Option DQuick Check:
Kotlinwhenuses arrows and braces [OK]
when [OK]- Using colon (:) instead of arrow (->)
- Confusing
whenwith switch syntax - Omitting parentheses around the variable
val x = 3
when (x) {
1, 2 -> println("Small")
in 3..5 -> println("Medium")
else -> println("Large")
}Solution
Step 1: Check the value of
The variablexxis 3.Step 2: Match
3 is not in 1 or 2, but it is in the range 3..5, so "Medium" is printed.xwithwhencasesFinal Answer:
Medium -> Option AQuick Check:
3 in 3..5 means output is "Medium" [OK]
- Ignoring ranges and picking wrong case
- Assuming 3 matches 1 or 2
- Thinking else runs when a range matches
when expression:val y = 10
when y {
5 -> println("Five")
10 -> println("Ten")
else -> println("Other")
}Solution
Step 1: Check
Thewhensyntaxwhenexpression requires parentheses around the variable:when (y).Step 2: Check other syntax parts
Braces are present. Arrows (->) are correctly used after all cases includingelse. The syntax error is missing parentheses aroundy.Final Answer:
Missing parentheses aroundyinwhen-> Option AQuick Check:
whenneeds parentheses around the subject [OK]
when [OK]- Omitting parentheses around the variable
- Forgetting arrows after cases
- Using
whenwithout braces
when expression to categorize ages into groups: "Child" for 0-12, "Teen" for 13-19, "Adult" for 20-64, and "Senior" for 65 and above. Which when expression correctly implements this?Solution
Step 1: Understand
when { age >= 0 && age <= 12 -> "Child" age >= 13 && age <= 19 -> "Teen" age >= 20 && age <= 64 -> "Adult" age >= 65 -> "Senior" else -> "Unknown" } useswhenwith condition checkswhenwithout argument and checks conditions with boolean expressions, which is valid and flexible.Step 2: Check other options for correctness
when (age) { in 0..12 -> "Child" in 13..19 -> "Teen" in 20..64 -> "Adult" else -> "Senior" } is valid but misses handling negative ages explicitly; when (age) { 0..12 -> "Child" 13..19 -> "Teen" 20..64 -> "Adult" 65 -> "Senior" } uses invalid syntax for ranges; when (age) { in 0..12 -> "Child" in 13..19 -> "Teen" in 20..64 -> "Adult" in 65..100 -> "Senior" else -> "Unknown" } limits "Senior" to 65-100 and has an else for unknown ages.Step 3: Choose the best option
when { age >= 0 && age <= 12 -> "Child" age >= 13 && age <= 19 -> "Teen" age >= 20 && age <= 64 -> "Adult" age >= 65 -> "Senior" else -> "Unknown" } covers all age ranges clearly with conditions and includes an else for unknown ages.Final Answer:
when { age >= 0 && age <= 12 -> "Child" age >= 13 && age <= 19 -> "Teen" age >= 20 && age <= 64 -> "Adult" age >= 65 -> "Senior" else -> "Unknown" } -> Option BQuick Check:
Use condition checks insidewhenfor flexible ranges [OK]
when for complex ranges [OK]- Using invalid range syntax without 'in'
- Not handling unexpected values with else
- Limiting ranges incorrectly or missing conditions
Ready to prove it?
Pass the test and this pattern moves unknown
