With function behavior and use cases in Kotlin - Time & Space Complexity
We want to understand how the time it takes to run a Kotlin function using with changes as the input grows.
How does using with affect the number of steps the program takes?
Analyze the time complexity of the following code snippet.
fun printNames(names: List) {
with(names) {
forEach { name ->
println(name)
}
}
}
This code prints each name from a list using the with function to access the list's methods directly.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The
forEachloop that goes through each name in the list. - How many times: It runs once for every name in the list, so as many times as the list size.
As the list gets bigger, the number of print steps grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 print steps |
| 100 | 100 print steps |
| 1000 | 1000 print steps |
Pattern observation: The steps grow directly with the number of names. Double the names, double the steps.
Time Complexity: O(n)
This means the time to run grows in a straight line with the number of items in the list.
[X] Wrong: "Using with makes the code run faster because it changes how the loop works."
[OK] Correct: The with function just helps write code cleaner by letting you call methods on an object without repeating its name. It does not change how many times the loop runs.
Understanding how helper functions like with affect time helps you explain your code clearly and shows you know what really impacts performance.
"What if we replaced forEach with a nested loop inside with? How would the time complexity change?"
Practice
with function in Kotlin?Solution
Step 1: Understand the role of
Thewithwithfunction groups multiple calls on the same object, so you don't repeat the object name.Step 2: Compare with other options
Options A, B, and D describe unrelated Kotlin features like class definition, threading, and exception handling.Final Answer:
To execute multiple operations on the same object without repeating its name -> Option CQuick Check:
withgroups calls on one object = C [OK]
with avoids repeating object name [OK]- Confusing
withwith threading or concurrency - Thinking
withcreates new classes - Assuming
withhandles exceptions
with in Kotlin?Solution
Step 1: Recall the syntax of
The correct syntax iswithwith(object) { /* code block */ }, where the object is passed as an argument and the block follows in braces.Step 2: Identify incorrect syntax
Options B, C, and D misuse arrow notation or omit parentheses, which are syntax errors.Final Answer:
with(object) { /* code block */ } -> Option AQuick Check:
Correctwithsyntax uses parentheses and braces = A [OK]
with [OK]- Omitting parentheses around the object
- Using arrow notation incorrectly
- Placing the block outside braces
data class Person(var name: String, var age: Int)
fun main() {
val person = Person("Alice", 25)
val result = with(person) {
age += 1
"${name} is now $age years old"
}
println(result)
}Solution
Step 1: Analyze the
Thewithblock behaviorwithfunction usespersonas the context. Inside,ageis incremented by 1, changing it from 25 to 26.Step 2: Evaluate the returned string
The last expression in the block is the string interpolation "${name} is now $age years old", which becomes "Alice is now 26 years old".Final Answer:
Alice is now 26 years old -> Option DQuick Check:
Age incremented insidewith= D [OK]
with is the return value [OK]- Forgetting that age is incremented inside
with - Thinking string interpolation causes error
- Assuming modifying properties causes runtime error
with:
fun main() {
val list = listOf(1, 2, 3)
with(list) {
add(4)
println(this)
}
}Solution
Step 1: Check the list type and mutability
The list is created withlistOf, which returns an immutable list that does not supportadd.Step 2: Understand the error cause
Callingadd(4)on an immutable list causes a compile-time error because the method is not available.Final Answer:
Cannot calladdon an immutable list -> Option AQuick Check:
Immutable list blocksaddmethod = A [OK]
- Assuming
withchanges mutability - Thinking
thisis incorrect insidewith - Ignoring immutability of
listOf
with to increase all scores by 5 points and return the updated map?
Choose the correct Kotlin code snippet.Solution
Step 1: Understand map mutability and
The map is mutable, so we can update values by keys insidewithusagewith. with(students) { for (key in keys) this[key] = this[key]!! + 5; this } correctly loops keys and updates values.Step 2: Analyze other options for correctness
with(students) { keys.forEach { it += 5 }; this } tries to add 5 to keys (strings), which is invalid. with(students) { mapValues { it.value + 5 } } returns a new map but does not update original. with(students) { forEach { it.value += 5 }; this } tries to modifyit.valueinforEach, but map entries are immutable in this context.Final Answer:
with(students) { for (key in keys) this[key] = this[key]!! + 5; this } -> Option BQuick Check:
Update map values by keys insidewith= B [OK]
with [OK]- Trying to modify keys instead of values
- Assuming
mapValuesmutates original map - Modifying map entries directly in
forEachcauses error
Ready to prove it?
Pass the test and this pattern moves unknown
