Junior
O que são as 'funções de escopo' em Kotlin e quando devem ser usadas?
sobes.tech IA
Resposta da IA
As funções de escopo permitem executar um bloco de código no contexto de um objeto. As funções principais são: let, run, with, apply, also. Cada uma tem as suas próprias características em relação ao recetor (invocador, receptor) e ao valor de retorno.
| Função | Recetor | Valor de retorno |
|---|---|---|
let |
it |
O resultado da última expressão no bloco |
run |
this |
O resultado da última expressão no bloco |
with |
this (não como método de extensão) |
O resultado da última expressão no bloco |
apply |
this |
O próprio objeto configurado |
also |
it |
O próprio objeto configurado |
Utilização:
let: Para realizar ações sobre um objeto que pode ser null, ou para introduzir uma variável local com um nome mais curto.
// Exemplo: chamada segura de método em um objeto nullable
val str: String? = "Hello"
str?.let {
println(it.length) // Executa apenas se str não for null
}
run: Para executar um bloco de código com o contexto do objeto (comowith), mas como método de extensão, ou quando se deseja calcular um valor no contexto do objeto.
// Exemplo: configuração de objeto e obtenção do resultado
val configurations = buildList {
add("Config 1")
add("Config 2")
}.run {
println("Applying configurations...")
joinToString(", ") // Executa no contexto de List<String>, retorna String
}
println(configurations)
with: Para agrupar chamadas de métodos de um objeto sem usar "ponto" antes de cada chamada. Não é um método de extensão.
// Exemplo: agrupamento de chamadas de métodos de um mesmo objeto
val person = Person("Alice", 30)
with(person) {
println(name) // Acesso direto às propriedades
println(age)
}
apply: Para configurar um objeto. Retorna o próprio objeto configurado. Útil para criar e inicializar objetos em uma única expressão.
// Exemplo: criação e configuração de um objeto em um passo
val button = Button().apply {
text = "Click Me"
onClick = { println("Button clicked") }
}
also: Para realizar ações adicionais sobre um objeto, como logging, após alguma operação. Retorna o próprio objeto.
// Exemplo: logging após realizar uma ação
val number = 42
val squared = number.also {
println("Processing number: $it") // Executa sobre it (number), retorna number
}.run {
this * this // Executa sobre this (number), retorna o quadrado
}
println("Squared value: $squared")
A escolha da função de escopo adequada depende do que se deseja fazer com o objeto e qual valor deve ser retornado.