O que são Scope Functions em Kotlin?

Scope Functions são cinco funções da biblioteca padrão do Kotlin — let, run, with, apply e also — que permitem executar um bloco de código no contexto de um objeto. Elas deixam o código mais conciso e expressivo.

A diferença entre elas está em como o objeto é referenciado dentro do bloco (this ou it) e no que cada uma retorna.

Resumo rápido

FunçãoReferênciaRetorno
letitResultado do lambda
runthisResultado do lambda
withthisResultado do lambda
applythisO próprio objeto
alsoitO próprio objeto

let — transformações e null safety

val nome: String? = "Kotlin Brasil"
nome?.let {
    println("O nome tem ${it.length} caracteres")
}

Perfeito pra trabalhar com valores nullable de forma segura.

apply — configurar objetos

data class Servidor(var host: String = "", var porta: Int = 0, var protocolo: String = "")

val servidor = Servidor().apply {
    host = "api.kotlin.dev.br"
    porta = 443
    protocolo = "HTTPS"
}
println(servidor)

O apply retorna o próprio objeto, ideal pra configurar e já usar em seguida.

also — ações laterais

val numeros = mutableListOf(1, 2, 3)
    .also { println("Lista original: $it") }
    .also { it.add(4) }

println(numeros) // [1, 2, 3, 4]

Bom pra logging e debug sem quebrar a cadeia de chamadas.

run — calcular resultado

val resultado = "Kotlin".run {
    println("Processando: $this")
    length * 2
}
println(resultado) // 12

with — operar sobre um objeto

val sb = StringBuilder()
val texto = with(sb) {
    append("Olá, ")
    append("mundo!")
    toString()
}
println(texto) // Olá, mundo!

Qual usar?

Na dúvida: apply pra configurar, let pra null safety, also pra ações laterais, run pra calcular algo e with quando já tem o objeto em mãos.