Trailing lambda convention in Kotlin - Time & Space Complexity
Let's see how using the trailing lambda style affects how many steps a program takes.
We want to know if this style changes how long the code runs as input grows.
Analyze the time complexity of the following code snippet.
fun processList(items: List<Int>, action: (Int) -> Unit) {
for (item in items) {
action(item)
}
}
// Using trailing lambda convention
processList(listOf(1, 2, 3)) { item ->
println(item)
}
This code runs an action on each item in a list, using the trailing lambda style for the action.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Looping through each item in the list.
- How many times: Once for every item in the list (n times).
Each item causes one action call, so more items mean more steps.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 actions |
| 100 | 100 actions |
| 1000 | 1000 actions |
Pattern observation: The number of steps grows directly with the number of items.
Time Complexity: O(n)
This means the time to finish grows in a straight line as the list gets bigger.
[X] Wrong: "Using the trailing lambda makes the code run faster."
[OK] Correct: The trailing lambda is just a style choice. It does not change how many times the loop runs or how long the program takes.
Understanding how code style choices like trailing lambdas affect performance helps you explain your code clearly and confidently.
What if the action inside the lambda also loops over the list? How would the time complexity change?
Practice
trailing lambda convention in Kotlin?Solution
Step 1: Understand the trailing lambda convention and compare options
The trailing lambda convention lets you write a lambda expression outside the parentheses if it is the last argument of a function. Only "To allow placing the lambda expression outside the parentheses when it is the last argument" correctly describes this behavior. Other options contradict the convention.Final Answer:
To allow placing the lambda expression outside the parentheses when it is the last argument -> Option AQuick Check:
Trailing lambda = lambda outside parentheses [OK]
- Thinking lambdas must always be inside parentheses
- Confusing trailing lambda with lambda variable declaration
- Believing trailing lambda disallows lambdas as arguments
Solution
Step 1: Identify correct trailing lambda syntax and check other options
Trailing lambda means the lambda is placed outside the parentheses.list.filter { it > 0 }shows this correctly.list.filter({ it > 0 })uses lambda inside parentheses (valid but not trailing).list.filter(it > 0)and D are syntax errors.Final Answer:
list.filter { it > 0 } -> Option AQuick Check:
Trailing lambda = lambda outside parentheses [OK]
- Putting lambda inside parentheses when trailing lambda is expected
- Omitting parentheses incorrectly
- Writing lambda without braces
fun greet(action: () -> String) = println(action())
greet { "Hello, Kotlin!" }Solution
Step 1: Understand the function call and evaluate the output
The functiongreettakes a lambda returning a String and prints its result. The call uses trailing lambda syntax. The lambda returns "Hello, Kotlin!" which is printed byprintln.Final Answer:
Hello, Kotlin! -> Option DQuick Check:
Trailing lambda call prints lambda result [OK]
- Expecting syntax error due to trailing lambda
- Confusing return value with Unit
- Missing that println prints the lambda result
fun calculate(x: Int, operation: (Int) -> Int): Int {
return operation(x)
}
val result = calculate(5) operation { it * 2 }Solution
Step 1: Analyze the function call syntax and correct trailing lambda usage
The function callcalculate(5) operation { it * 2 }is invalid because the trailing lambda must be placed immediately after the parentheses without extra tokens. The correct call iscalculate(5) { it * 2 }. The wordoperationshould not appear between parentheses and lambda.Final Answer:
Trailing lambda must be outside parentheses but parentheses are missing -> Option CQuick Check:
Trailing lambda goes right after parentheses [OK]
- Inserting parameter name between parentheses and lambda
- Forgetting to remove parentheses when using trailing lambda
- Confusing function parameter names with call syntax
fun processNumbers(numbers: List<Int>, filter: (Int) -> Boolean, action: (Int) -> Unit) {
for (number in numbers) {
if (filter(number)) action(number)
}
}Which is the correct way to call
processNumbers using trailing lambda convention for both lambdas?Solution
Step 1: Understand trailing lambda rules for multiple lambdas and apply to function call
Kotlin allows only the last lambda argument to be passed outside parentheses as a trailing lambda. Sinceactionis the last lambda, it can be trailing. The first lambdafiltermust be inside parentheses.processNumbers(listOf(1,2,3), { it > 1 }) { println(it) }correctly placesfilterinside parentheses andactionoutside.Final Answer:
processNumbers(listOf(1,2,3), { it > 1 }) { println(it) } -> Option BQuick Check:
Only last lambda can be trailing [OK]
- Trying to put multiple lambdas outside parentheses
- Swapping lambda order incorrectly
- Putting non-lambda arguments outside parentheses
Ready to prove it?
Pass the test and this pattern moves unknown
