Scope functions and lambdas help you write shorter and clearer code by running blocks of code on objects. Testing them ensures your code works as expected.
Testing scope functions and lambdas in Kotlin
val result = object.scopeFunction { // lambda code here } // Common scope functions: let, run, with, apply, also
Scope functions take a lambda (a small block of code) as an argument.
Inside the lambda, you can access the object as this or it, depending on the function.
let passes the object as it to the lambda and returns the lambda result.val name = "Kotlin" val length = name.let { it.length }
apply runs the lambda with this as the object and returns the object itself.val builder = StringBuilder().apply { append("Hello") append(" World") }
run executes the lambda and returns its result. It is not called on an object.val result = run { val x = 5 val y = 10 x + y }
This program shows how to use let, apply, and also scope functions and how to test a simple lambda function.
fun main() { val text = "hello" // Using let to get length val length = text.let { it.length } // Using apply to build a string val builder = StringBuilder().apply { append("Hi, ") append(text.replaceFirstChar { it.uppercase() }) } // Using also to print and return the object val printed = builder.also { println("Built string: $it") } // Testing lambda directly val lambda: (Int) -> Int = { x -> x * 2 } val lambdaResult = lambda(4) println("Length: $length") println("Builder content: $printed") println("Lambda result: $lambdaResult") }
Remember that let and also pass the object as it, while apply and run use this.
Use scope functions to make your code cleaner and avoid repeating object names.
Testing lambdas means calling them with test inputs and checking the outputs.
Scope functions help run code blocks on objects in a clean way.
Lambdas are small blocks of code you can pass around and test easily.
Testing scope functions and lambdas ensures your code works as expected.
Practice
Solution
Step 1: Understand scope function behavior
Thealsofunction executes the lambda with the object asitand returns the original object.Step 2: Compare with other functions
letreturns the lambda result,runreturns lambda result,applyreturns the object but usesthisinside lambda.Final Answer:
also -> Option BQuick Check:
Returns original object after lambda = also [OK]
- Confusing 'also' with 'let' return values
- Mixing 'apply' and 'also' usage
- Assuming 'run' returns the object
let scope function on a nullable variable name?Solution
Step 1: Check nullable safe call usage
To safely callleton a nullable variable, use the safe call operator?..Step 2: Validate lambda syntax
The lambda must be enclosed in braces{}and useitas the implicit parameter.Final Answer:
name?.let { println(it) } -> Option AQuick Check:
Safe call with lambda braces = name?.let { println(it) } [OK]
- Omitting safe call operator on nullable
- Incorrect lambda syntax without braces
- Trying to call let as a standalone function
val result = "hello".run {
println(this.uppercase())
this.length
}
println(result)Solution
Step 1: Understand
Therunbehaviorrunfunction executes the lambda withthisas the receiver and returns the lambda's last expression.Step 2: Trace the code execution
Inside lambda,println(this.uppercase())prints "HELLO". Thenthis.lengthreturns 5, assigned toresult. Finally,println(result)prints 5.Final Answer:
HELLO 5 -> Option DQuick Check:
run prints uppercase then returns length = HELLO and 5 [OK]
- Assuming run returns the printed string
- Confusing this with it inside lambda
- Mixing order of printed lines
val numbers = listOf(1, 2, 3)
numbers.also {
it.add(4)
}
println(numbers)Solution
Step 1: Check list mutability
listOfcreates an immutable list; callingaddis not allowed.Step 2: Understand scope function effect
alsoruns the lambda but does not change immutability; trying to add causes a runtime error.Final Answer:
Cannot call add on immutable list -> Option CQuick Check:
Immutable list blocks add() method = Cannot call add on immutable list [OK]
- Assuming also changes list mutability
- Ignoring immutable list restrictions
- Thinking lambda syntax is wrong
val nums = listOf(1, null, 3, null, 5), which code snippet correctly uses scope functions and lambdas to create a list of doubled non-null values?Solution
Step 1: Remove nulls before mapping
UsefilterNotNull()to exclude null values safely.Step 2: Map remaining values to double
Applymap { it * 2 }on non-null list to double each integer.Final Answer:
nums.filterNotNull().map { it * 2 } -> Option AQuick Check:
Filter nulls then map doubling = nums.filterNotNull().map { it * 2 } [OK]
- Mapping before filtering nulls causes null results
- Using unsafe !! operator risking exceptions
- Misusing also or run without returning correct list
Ready to prove it?
Pass the test and this pattern moves unknown
