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

Sajid Ali
2 min readJun 19, 2024

Kotlin’s scope functions are powerful tools that can help you write cleaner, more expressive code. By using run, let, apply, also, and with, you can streamline your Kotlin code and make it more readable. In this post, we'll explore each of these functions, understand their purposes, and learn when to use them.

run

The run function executes a block of code and returns its result. It's useful when you need to perform multiple operations on an object and return a result from the block.

run is perfect for initialising and returning a new object or performing a series of operations on an object.

val result = someObject.run {
// operations
computeSomething()
}

In this example, someObject.run allows us to perform operations on someObject and then return the result of computeSomething().

let

The let function executes a block of code with the object as its argument and returns the block's result. It is ideal for performing operations on a nullable object and chaining calls.

let is particularly useful when you want to safely operate on a nullable object.

val result = someNullableObject?.let {
// operations
it.computeSomething()
}

Here, someNullableObject?.let safely operates on the nullable object, performing operations only if the object is not null.

apply

The apply function executes a block of code on an object and returns the object itself. This is great for configuring an object, especially during initialisation.

Use apply when you want to set properties of an object and return the configured object.

val person = Person().apply {
name = "John"
age = 30
}

In this case, apply helps to initialise and configure the Person object in a concise way.

also

Similar to apply, the also function passes the object as an argument and returns the object itself. It's suitable for performing additional operations that do not modify the object, such as logging or validation.

Use also for non-mutating operations like logging or debugging.

val person = Person("John").also {
println("Created person: $it")
}

Here, also is used to log the creation of the Person object without altering it.

with

The with function executes a block of code on an object and returns the block's result. It is convenient for calling multiple methods on an object without repeatedly referencing it.

with is handy for performing multiple operations on a single object in a clean manner.

val result = with(someObject) {
// operations
computeSomething()
}

In this example, with(someObject) allows for multiple operations on someObject, and then it returns the result of computeSomething().

Summary

  • run: Use when you need to perform operations on an object and return a result.
  • let: Ideal for operations on nullable objects or chaining calls.
  • apply: Best for initialising and configuring an object.
  • also: Suitable for additional operations like logging without modifying the object.
  • with: Convenient for multiple operations on a single object without repeatedly referencing it.

By mastering these scope functions, you can make your Kotlin code more expressive and concise. Start incorporating them into your projects to enhance readability and efficiency.

Did you find this post helpful? Follow me for more Kotlin tips and tricks!

#Kotlin #Programming #TechTips #MobileDevelopment

--

--

Sajid Ali
0 Followers

Kotlin developer specialising in Android TV apps. Experienced in mobile and backend development.