Lambda syntax and declaration in Kotlin - Time & Space Complexity
When we use lambdas in Kotlin, we want to know how fast they run as the input grows.
We ask: How does the time to run a lambda change when we give it more data?
Analyze the time complexity of the following code snippet.
val numbers = listOf(1, 2, 3, 4, 5)
val doubled = numbers.map { it * 2 }
println(doubled)
This code uses a lambda to double each number in a list.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The lambda inside
mapruns once for each item in the list. - How many times: Exactly as many times as there are items in the list.
Each item in the list causes one lambda call, so more items mean more calls.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 lambda calls |
| 100 | 100 lambda calls |
| 1000 | 1000 lambda calls |
Pattern observation: The number of operations grows directly with the number of items.
Time Complexity: O(n)
This means the time to run grows in a straight line with the input size.
[X] Wrong: "The lambda runs only once no matter the list size."
[OK] Correct: The lambda runs for every item, so more items mean more runs.
Understanding how lambdas run helps you explain code efficiency clearly and confidently.
"What if we replaced map with filter? How would the time complexity change?"
Practice
Solution
Step 1: Understand lambda basics
Lambdas are small functions without a name that can be stored in variables.Step 2: Compare with other options
Classes, loops, and variable declarations are different concepts from lambdas.Final Answer:
A small unnamed function stored in a variable -> Option AQuick Check:
Lambda = unnamed function [OK]
- Confusing lambdas with classes
- Thinking lambdas are loops
- Mixing lambdas with variable declarations
Solution
Step 1: Recall lambda syntax
Lambdas use curly braces with parameters before an arrow, then the body: { params -> body }Step 2: Check each option
{ a, b -> a + b } matches correct syntax. (a, b) -> { a + b } wrongly uses parentheses outside braces. fun(a, b) { return a + b } is a function, not a lambda. { a, b : Int -> a + b } incorrectly places type annotation.Final Answer:
{ a, b -> a + b } -> Option DQuick Check:
Correct lambda syntax = { params -> body } [OK]
- Using parentheses instead of braces
- Trying to write full function syntax
- Incorrect type annotations inside lambda
val multiply = { x: Int, y: Int -> x * y }
println(multiply(3, 4))Solution
Step 1: Understand the lambda function
The lambda takes two Ints x and y, and returns their product x * y.Step 2: Calculate the output
Calling multiply(3, 4) returns 3 * 4 = 12.Final Answer:
12 -> Option AQuick Check:
3 * 4 = 12 [OK]
- Adding instead of multiplying
- Concatenating numbers as strings
- Syntax errors in lambda call
val greet = { name String -> "Hello, $name" }Solution
Step 1: Check parameter syntax
Parameters must have a colon between name and type: name: StringStep 2: Verify lambda structure
The arrow -> is present after parameters, and string interpolation is allowed inside lambdas.Final Answer:
Missing colon between parameter and type -> Option CQuick Check:
Parameter syntax = name: Type [OK]
- Omitting colon in parameter declaration
- Forgetting arrow after parameters
- Thinking string interpolation is disallowed
Solution
Step 1: Understand filter usage
filter takes a lambda returning true for elements to keep. Correct condition is x % 2 == 0 for even numbers.Step 2: Check each option
val evenFilter = { list: List<Int> -> list.filter { it % 2 == 0 } } correctly uses filter with lambda and modulus check. val evenFilter = { list: List<Int> -> list.filter(it % 2 == 0) } misses braces for lambda. val evenFilter = { list: List<Int> -> list.filter { x -> x / 2 == 0 } } uses division instead of modulus. val evenFilter = { list: List<Int> -> list.filter { x -> x % 2 = 0 } } uses assignment (=) instead of comparison (==).Final Answer:
val evenFilter = { list: List<Int> -> list.filter { it % 2 == 0 } } -> Option BQuick Check:
Filter with { it % 2 == 0 } keeps evens [OK]
- Using assignment (=) instead of comparison (==)
- Using division (/) instead of modulus (%)
- Omitting braces around lambda in filter
Ready to prove it?
Pass the test and this pattern moves unknown
