📖 Scenario: Imagine you are creating a simple counter system where each counter remembers its own count. This is useful in many apps like tracking clicks or scores.
🎯 Goal: You will build a Kotlin program that creates counters using closures. Each counter will remember its own count and increase it when called.
📋 What You'll Learn
Create a function that returns another function (a closure)
Use a variable inside the outer function to keep count
The inner function should increase and return the count
Create multiple counters to show they keep separate counts
Print the counts to see the closure in action
💡 Why This Matters
🌍 Real World
Closures are used in apps to keep track of user actions, like clicks or scores, without using global variables.
💼 Career
Understanding closures helps in writing clean, modular code and is important for many programming jobs involving functional programming or event handling.
Progress0 / 4 steps
1
Create a function with a count variable
Write a function called makeCounter that declares a variable count initialized to 0 inside it.
Kotlin
Hint
Think of count as the memory inside the function that will keep track of the number.
2
Return a function that increases count
Inside makeCounter, return a lambda function that increases count by 1 and returns the new value.
Kotlin
Hint
The returned lambda remembers the count variable and changes it each time it is called.
3
Create two counters and call them
Create two variables counterA and counterB by calling makeCounter(). Then call counterA() twice and counterB() once, storing the results in a1, a2, and b1 respectively.
Kotlin
Hint
Each counter should keep its own count separate from the other.
4
Print the counts to see closure effect
Print the values of a1, a2, and b1 each on its own line using println.
Kotlin
Hint
Each print shows how the counters remember their own counts separately.
Practice
(1/5)
1. What does a closure in Kotlin do with variables from its surrounding scope?
easy
A. It copies the variables but cannot modify them.
B. It deletes those variables to save memory.
C. It ignores variables outside its own body.
D. It remembers and can use those variables even after the outer function ends.
Solution
Step 1: Understand closure behavior
A closure is a function that keeps access to variables from where it was created, even if that place no longer exists.
Step 2: Apply to Kotlin closures
In Kotlin, lambdas capture variables from the surrounding scope and can use them later.
Final Answer:
It remembers and can use those variables even after the outer function ends. -> Option D
Quick Check:
Closure remembers and can use variables even after outer ends = C [OK]
Hint: Closures keep variables alive beyond their original scope [OK]
Common Mistakes:
Thinking closures delete outside variables
Believing closures only copy variables without access
Assuming closures ignore outside variables
2. Which of the following is the correct syntax to create a lambda that captures a variable count in Kotlin?
In Kotlin, a lambda can access variables from outside without parameters by just using them inside curly braces.
Step 2: Check each option
val lambda = { println(count) } correctly uses count from outside. val lambda = (count) -> println(count) tries to declare a parameter but syntax is wrong. val lambda = fun(count) { println(count) } uses fun keyword incorrectly. val lambda = { count -> println() } declares a parameter but does not use it properly.
Final Answer:
val lambda = { println(count) } -> Option B
Quick Check:
Lambda uses outside variable directly = A [OK]
Hint: Use curly braces and refer to outside variables directly [OK]
Common Mistakes:
Trying to declare external variables as lambda parameters
Using incorrect lambda syntax with fun keyword
Not referencing the variable inside the lambda body
3. What will be the output of the following Kotlin code?
fun main() {
var x = 5
val closure = { x += 1; println(x) }
closure()
closure()
println(x)
}
medium
A. 6\n7\n7
B. 6\n6\n5
C. 6\n7\n5
D. 5\n5\n5
Solution
Step 1: Trace the closure calls and variable changes
Initially, x = 5. First closure call increments x to 6 and prints 6. Second call increments x to 7 and prints 7.
Step 2: Print final value of x
After two increments, x is 7, so printing x outputs 7.
Final Answer:
6\n7\n7 -> Option A
Quick Check:
Closure increments x twice, final x = 7 [OK]
Hint: Closures can modify captured vars; track changes stepwise [OK]
Common Mistakes:
Assuming closure uses a copy of x, not the original
Forgetting x increments on each closure call
Confusing printed values with initial x
4. Identify the error in this Kotlin code that tries to capture a variable inside a loop:
fun main() {
val funcs = mutableListOf<() -> Unit>()
for (i in 1..3) {
funcs.add { println(i) }
}
funcs.forEach { it() }
}
medium
A. All lambdas print 3 instead of 1, 2, 3
B. Runtime error: variable i not found
C. Lambdas print 1, 2, 3 correctly
D. Syntax error: cannot capture loop variable
Solution
Step 1: Understand variable capture in Kotlin loops
Kotlin captures the loop variable i correctly for each lambda, so each lambda remembers its own i value.
Step 2: Check output of lambdas
When calling each lambda, they print 1, 2, and 3 respectively, no error occurs.
Final Answer:
Lambdas print 1, 2, 3 correctly -> Option C
Quick Check:
Kotlin captures loop vars per iteration = B [OK]
Hint: Kotlin captures loop vars freshly each iteration [OK]
Common Mistakes:
Assuming all lambdas print the last loop value
Expecting syntax or runtime errors for capturing loop vars
Confusing Kotlin behavior with other languages like JavaScript
5. You want to create a list of functions in Kotlin, each printing a different number from 1 to 3. Which code correctly captures the variable to avoid all functions printing the same number?
val funcs = mutableListOf<() -> Unit>()
for (i in 1..3) {
// What to do here?
}
funcs.forEach { it() }
hard
A. for (i in 1..3) { funcs.add { println(i) } }
B. for (i in 1..3) { val x = i + 1; funcs.add { println(x) } }
C. for (i in 1..3) { funcs.add { println(i + 1) } }
D. for (i in 1..3) { val x = i; funcs.add { println(x + 1) } }
Solution
Step 1: Understand variable capture in Kotlin for loops
In Kotlin, lambdas added inside a for (i in 1..3) capture the i from their iteration correctly.
Step 2: Check each snippet
funcs.add { println(i) } prints 1 then 2 then 3. The snippet with val x = i + 1; funcs.add { println(x) } prints 2 3 4. funcs.add { println(i + 1) } prints 2 3 4. val x = i; funcs.add { println(x + 1) } prints 2 3 4.
Final Answer:
for (i in 1..3) { funcs.add { println(i) } } -> Option A
Quick Check:
Direct println(i) in for loop lambda = B [OK]
Hint: Directly use loop var i inside lambda [OK]
Common Mistakes:
Declaring x = i + 1 and printing x (prints 2 3 4)
Printing i + 1 directly (prints 2 3 4)
Copying to x = i but printing x + 1 (prints 2 3 4)
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.