What does it mean that functions are first-class citizens in Kotlin?
It means functions can be stored in variables, passed as arguments to other functions, and returned from functions, just like any other data type.
Click to reveal answer
beginner
How can you store a function in a variable in Kotlin?
You can assign a function to a variable by using a function type, for example:
val greet: (String) -> String = { name -> "Hello, $name" }
Click to reveal answer
intermediate
Why is passing functions as arguments useful in Kotlin?
It allows you to write flexible and reusable code by letting functions customize behavior without changing the original function's code.
Click to reveal answer
intermediate
What Kotlin feature supports returning functions from other functions?
Kotlin supports returning functions by specifying a function type as the return type, for example:
fun makeMultiplier(factor: Int): (Int) -> Int = { number -> number * factor }
Click to reveal answer
beginner
Give a real-life example of why first-class functions are helpful.
Imagine you want to sort a list of names differently each time. By passing different comparison functions, you can reuse the same sorting code but change how sorting works easily.
Click to reveal answer
What can you NOT do with first-class functions in Kotlin?
APass them as arguments
BChange their syntax to JavaScript style
CReturn them from other functions
DStore them in variables
✗ Incorrect
First-class functions allow storing, passing, and returning functions, but you cannot change Kotlin's syntax to JavaScript style.
Which Kotlin syntax correctly declares a variable holding a function that takes an Int and returns an Int?
Aval f: function(Int): Int = { x -> x + 1 }
Bval f: Int -> Int = { x -> x + 1 }
Cval f: (Int) -> Int = { x -> x + 1 }
Dval f = function(x: Int): Int { return x + 1 }
✗ Incorrect
In Kotlin, function types are declared with parentheses: (Int) -> Int.
Why are first-class functions important for higher-order functions?
ABecause they allow functions to be used as data
BBecause they make functions faster
CBecause they prevent errors
DBecause they change the function's name
✗ Incorrect
Higher-order functions take or return functions, which is possible only if functions are first-class citizens.
Which of these is an example of returning a function in Kotlin?
Afun add(x: Int) = x + 1
Bfun printHello() { println("Hello") }
Cval f = { x: Int -> x * 2 }
Dfun makeAdder(x: Int): (Int) -> Int = { y -> x + y }
✗ Incorrect
Option D returns a function that adds x to its input.
Which statement about first-class functions in Kotlin is TRUE?
AFunctions can be assigned to variables.
BFunctions can only be declared inside classes.
CFunctions cannot be passed as arguments.
DFunctions must always return Unit.
✗ Incorrect
Functions in Kotlin can be assigned to variables, making them first-class citizens.
Explain in your own words what it means that functions are first-class in Kotlin and why this is useful.
Think about how you can treat functions like any other value.
You got /4 concepts.
Describe a simple example where passing a function as an argument in Kotlin makes your code more flexible.
Imagine changing behavior without rewriting the whole function.
You got /3 concepts.
Practice
(1/5)
1. Which of the following best explains why functions are considered first-class citizens in Kotlin?
easy
A. Because functions must always return a value.
B. Because functions cannot be nested inside other functions.
C. Because functions can be stored in variables, passed as arguments, and returned from other functions.
D. Because functions are only used for input/output operations.
Solution
Step 1: Understand the meaning of first-class functions
First-class functions means functions can be treated like any other value: stored, passed, and returned.
Step 2: Match this meaning with the options
Because functions can be stored in variables, passed as arguments, and returned from other functions. correctly states this ability, while others describe unrelated or incorrect facts.
Final Answer:
Because functions can be stored in variables, passed as arguments, and returned from other functions. -> Option C
Quick Check:
First-class functions = store, pass, return [OK]
Hint: Remember: first-class means functions act like variables [OK]
Common Mistakes:
Thinking functions must always return a value
Believing functions cannot be nested
Confusing first-class with input/output only
2. Which of the following is the correct syntax to assign a lambda function to a variable in Kotlin?
val greet = () -> println("Hello") matches the correct lambda syntax. val greet = fun() { println("Hello") } is a named function expression, B and D are invalid syntax.
Final Answer:
val greet = () -> println("Hello") -> Option D
Quick Check:
Lambda syntax = () -> expression [OK]
Hint: Look for arrow notation () -> for lambdas [OK]
Common Mistakes:
Using 'function()' keyword which doesn't exist
Confusing named function with lambda syntax
Using 'lambda' keyword which is invalid
3. What will be the output of the following Kotlin code?
fun operate(x: Int, y: Int, op: (Int, Int) -> Int): Int {
return op(x, y)
}
fun main() {
val sum = operate(5, 3) { a, b -> a + b }
println(sum)
}
medium
A. 8
B. 53
C. Error: Missing function body
D. 0
Solution
Step 1: Understand the operate function
It takes two Ints and a function 'op' that combines them, then returns the result of op(x, y).
Step 2: Analyze the lambda passed
The lambda { a, b -> a + b } adds the two numbers 5 and 3, so operate returns 8.
Final Answer:
8 -> Option A
Quick Check:
5 + 3 = 8 [OK]
Hint: Trace lambda execution with given inputs [OK]
Common Mistakes:
Concatenating numbers as strings instead of adding
Expecting syntax error due to lambda
Ignoring the lambda parameter and outputting 0
4. Identify the error in the following Kotlin code that uses a function as a parameter:
fun applyOperation(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
return operation(x, y)
}
fun main() {
val result = applyOperation(4, 2) { a, b -> a * b
println(result)
}
medium
A. Incorrect function parameter types.
B. Missing closing brace '}' for the lambda expression.
C. applyOperation should return Unit, not Int.
D. Lambda parameters must be declared outside the function call.
Solution
Step 1: Check lambda syntax in main()
The lambda passed to applyOperation lacks a closing brace '}', causing a syntax error.
Step 2: Verify other parts
Parameter types and return types are correct; lambda parameters inside call are valid.
Final Answer:
Missing closing brace '}' for the lambda expression. -> Option B
Quick Check:
Unclosed lambda = syntax error [OK]
Hint: Count opening and closing braces in lambdas [OK]
Common Mistakes:
Assuming parameter types are wrong
Thinking return type must be Unit
Believing lambda parameters can't be inline
5. You want to create a Kotlin function that takes a list of integers and a function to transform each integer, returning a new list with transformed values. Which of the following implementations correctly uses first-class functions to achieve this?
hard
A. fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
val result = mutableListOf<Int>()
for (num in nums) {
result.add(transformer(num))
}
return result
}
B. fun transformList(nums: List<Int>, transformer: Int): List<Int> {
return nums.map { transformer }
}
C. fun transformList(nums: List<Int>): List<Int> {
return nums.map { it * 2 }
}
D. fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
nums.forEach { transformer(it) }
return nums
}
Solution
Step 1: Understand the requirement
The function must accept a list and a function to transform each element, returning a new list with transformed values.
Step 2: Analyze each option
fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
val result = mutableListOf<Int>()
for (num in nums) {
result.add(transformer(num))
}
return result
} correctly takes a function parameter and applies it to each element, collecting results in a new list. fun transformList(nums: List<Int>, transformer: Int): List<Int> {
return nums.map { transformer }
} wrongly treats transformer as Int. fun transformList(nums: List<Int>): List<Int> {
return nums.map { it * 2 }
} lacks a transformer parameter. fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
nums.forEach { transformer(it) }
return nums
} applies transformer but returns original list without changes.
Final Answer:
fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
val result = mutableListOf<Int>()
for (num in nums) {
result.add(transformer(num))
}
return result
} -> fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
val result = mutableListOf<Int>()
for (num in nums) {
result.add(transformer(num))
}
return result
}
Quick Check:
Function parameter + new list = fun transformList(nums: List<Int>, transformer: (Int) -> Int): List<Int> {
val result = mutableListOf<Int>()
for (num in nums) {
result.add(transformer(num))
}
return result
} [OK]
Hint: Look for function parameter applied to each element and new list returned [OK]
Common Mistakes:
Passing transformer as Int instead of function
Not returning a new transformed list
Using forEach without collecting results
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.