Mastering Kotlin’s Scope Functions: apply, let, run, also, and with

Sumeet Panchal - "InnoVeda"
3 min readDec 22, 2024

Kotlin is celebrated for its concise and expressive syntax, and its scope functions like apply, let, run, also, and with are perfect examples of this. These functions not only make your code more readable but also unlock a more functional style of programming.

In this post, we'll explore how these functions work, their use cases, and when to choose one over the other.

1. "apply": Configure Objects

The apply function is an extension function used to configure an object. It returns the object itself after applying the given lambda.

Syntax

val obj = Object().apply {
property1 = value1
property2 = value2
}

Use Case

Use apply when you want to initialize or configure an object.

Example

val person = Person().apply {
name = "John"
age = 30
}
println(person) // Output: Person(name=John, age=30)

2. "let": Perform Operations on a Non-Null Object

The let function executes a block of code on the object it is called on. It is beneficial for null checks.

Syntax

val result = obj?.let {
// Perform operations
}

Use Case

Use let to safely perform actions on non-null objects.

Example

val name: String? = "Kotlin"
name?.let {
println("The name is $it")
}
// Output: The name is Kotlin

3. "run": Run a Block of Code and Return the Result

The run function is a combination of let and apply. It executes a block of code and returns the result of the lambda.

Syntax

val result = obj.run {
// Perform operations
value
}

Use Case

Use run when you need to perform multiple operations and return a value.

Example

val greeting = "Hello".run {
this + " World!"
}
println(greeting) // Output: Hello World!

4. "also": Perform Additional Actions

The also function is similar to apply but is used when you want to perform additional actions without modifying the object.

Syntax

val obj = Object().also {
// Perform additional actions
}

Use Case

Use also for logging, debugging, or performing side effects.

Example

val list = mutableListOf("A", "B", "C").also {
println("Original list: $it")
}
list.add("D")
println("Modified list: $list")
// Output:
// Original list: [A, B, C]
// Modified list: [A, B, C, D]

5. "with": Group Operations on an Object

The with function is used to group multiple operations on an object. Unlike apply and also, it is not an extension function.

Syntax

val result = with(obj) {
// Perform operations
value
}

Use Case

Use with when you have a lot of operations to perform on an object.

Example

val result = with(StringBuilder()) {
append("Hello")
append(" ")
append("World!")
toString()
}
println(result) // Output: Hello World!

Choosing the Right Function

Practical Example: Chaining Functions

Here’s a real-world example that combines these functions.

data class User(var name: String, var email: String)

val user = User("John Doe", "john@example.com").apply {
name = "Jane Doe"
}.also {
println("User details updated: $it")
}.let {
it.email
}.run {
println("User's email: $this")
}

Conclusion

Kotlin’s scope functions can make your code cleaner, more readable, and expressive when used appropriately. By understanding their differences and use cases, you can take your Kotlin development skills to the next level.

Happy coding!

--

--

Sumeet Panchal - "InnoVeda"
Sumeet Panchal - "InnoVeda"

Written by Sumeet Panchal - "InnoVeda"

Programming enthusiast specializing in Android and React Native, passionate about crafting intuitive mobile experiences and exploring innovative solutions.

No responses yet