Sobes.tech
Junior

Quais funções de escopo em Kotlin você conhece?

sobes.tech IA

Resposta da IA

  • let: Executa um bloco de código num objeto e devolve o resultado da última expressão. Frequentemente usado para chamadas seguras de métodos em objetos nulos.
  • run: Tem duas variantes:
    • Como função de extensão: Executa um bloco de código no objeto (this) e devolve o resultado da última expressão.
    • Como função independente: Executa um bloco de código sem receptor e devolve o resultado da última expressão.
  • with: Executa um bloco de código num objeto receptor fornecido como argumento e devolve o resultado da última expressão.
  • apply: Executa um bloco de código num objeto (this) e devolve o próprio objeto. Frequentemente usado para configurar propriedades do objeto.
  • also: Executa um bloco de código num objeto (it) e devolve o próprio objeto. Usado para ações secundárias no objeto.
// Exemplo de uso de let
val name: String? = "Kotlin"
val length = name?.let {
    // this == null
    // it == "Kotlin"
    it.length // Retorna o comprimento da string
} // length == 6

// Exemplo de uso de run como extensão
val numbers = mutableListOf(1, 2, 3)
val firstAndLast = numbers.run {
    listOf(first(), last())
    // this == numbers
} // firstAndLast == [1, 3]

// Exemplo de uso de run como função independente
val result = run {
    // Sem receptor
    println("Executando um bloco")
    1 + 2 // Retorna 3
} // result == 3

// Exemplo de uso de with
val configuration = configureUsing {
    // this - objeto passado para configureUsing
    width = 100
    height = 200
}

fun configureUsing(builder: ScopeExample.() -> Unit): ScopeExample {
    val example = ScopeExample()
    example.builder()
    return example
}

class ScopeExample {
    var width: Int = 0
    var height: Int = 0
}

// Exemplo de uso de apply
val person = mutableListOf<String>().apply {
    // this == lista
    add("Alice")
    add("Bob")
} // person == ["Alice", "Bob"]

// Exemplo de uso de also
val list = mutableListOf(1, 2, 3)
val doubledList = list.also {
    // it == lista
    println("Processando lista: $it")
}.map { it * 2 } // doubledList == [2, 4, 6]