Apply no Kotlin: Entenda Como Funciona com Exemplos Reais | Tiago Aguiar
Tiago Aguiar

Como Usar Apply no Kotlin: O Guia Completo com Exemplos Práticos

avatar
Função Apply no Kotlin
Função Apply no Kotlin

O apply é um daqueles recursos do Kotlin que quando você entende direito, muda completamente a forma como você escreve código. Ele torna o código mais legível, mais limpo e mais fácil de manter.

Mas vou ser honesto com você: muita gente usa o apply sem realmente entender o que está acontecendo por baixo dos panos. E pior, às vezes usa no lugar errado, para fazer coisas que não foram pensadas para ele.

Neste artigo, eu vou te explicar exatamente como o apply funciona, com exemplos práticos tanto em Kotlin puro quanto em aplicativos Android reais. Vou dividir isso em duas partes: primeiro a teoria pura da linguagem, depois exemplos práticos que você vai ver no dia a dia.

O Que é o Apply?

Deixa eu te explicar a teoria de forma direta. O apply nada mais é do que uma função onde você pode usar qualquer objeto dentro do Kotlin para retornar ele mesmo e fazer configurações nesses objetos.

É uma forma de inicializar objetos de uma maneira mais legível e flexível.

Parece complicado? Vou te mostrar o modo tradicional e o modo com apply para você ver a diferença na prática.

O Jeito Tradicional vs. Apply

Vamos supor que você tem uma estrutura de dados simples, um data class que é muito comum ter em qualquer projeto:

1
2
3
4
5
data class Usuario(
    var nome: String = "",
    var email: String = "",
    var altura: Double = 0.0
)

Qual que é o jeito tradicional de criar esse objeto e configurar as propriedades dele?

1
2
3
4
val userA = Usuario()
userA.nome = "Tiago"
userA.email = "tiago@exemplo.com"
userA.altura = 1.75

Funciona perfeitamente, sem problemas. Mas perceba que você está repetindo userA toda vez que quer acessar uma propriedade. E se você tiver 10, 15 propriedades para configurar? Vai ficar bem repetitivo.

Agora veja como fica com apply:

1
2
3
4
5
val userB = Usuario().apply {
    nome = "Tiago"
    email = "tiago@exemplo.com"
    altura = 1.75
}

Muito mais limpo, né? Você não precisa ficar repetindo o nome da variável toda hora. Dentro do bloco do apply, você já tem acesso direto às propriedades e funções do objeto.

Quando Realmente Faz Sentido Usar Apply

Agora, uma pergunta importante: tem alguma grande vantagem em fazer isso com um objeto pequeno como eu te mostrei?

Não necessariamente. Para três propriedades simples, tanto faz. Você poderia ter usado o jeito tradicional sem problema nenhum.

A grande vantagem do apply aparece quando você está lidando com configurações mais complexas, com múltiplas propriedades para definir.

Imagine que você tem uma classe de configuração de banco de dados com 15 propriedades diferentes. Ou uma classe de requisição HTTP com várias opções. Aí sim faz muito mais sentido usar o apply para organizar tudo.

O objetivo principal dele é criar objetos seguindo o padrão builder, que é um padrão de design muito usado para construção de objetos complexos.

Como Funciona Por Baixo dos Panos

Uma coisa importante para você entender: dentro do bloco do apply, você tem a referência para o próprio objeto.

Para ser mais explícito, você poderia escrever assim:

1
2
3
4
5
val user = Usuario().apply {
    this.nome = "Tiago"
    this.email = "tiago@exemplo.com"
    this.altura = 1.75
}

Viu o this ali? É a referência para o objeto que foi criado. Mas o Kotlin é esperto o suficiente para entender isso automaticamente, então você não precisa escrever this toda vez. É implícito.

Exemplo Prático: Configurações

Vamos ver um exemplo mais real de como usar o apply para configurações:

1
2
3
4
5
val config = mutableMapOf<String, String>().apply {
    put("tema", "escuro")
    put("idioma", "pt-BR")
    put("ambiente", "producao")
}

Olha como ficou legível! Você criou um mapa de configurações e já inicializou ele com os valores, tudo de forma clara e organizada.

Isso é muito melhor do que criar o mapa e depois ficar chamando config.put() várias vezes separadamente.

Exemplos Práticos no Android

Agora vamos para a parte que você mais vai usar no dia a dia: Android. Aqui é onde o apply realmente brilha.

Exemplo 1: Configurando um TextView

Dentro do Android, é comum você precisar configurar vários componentes de interface. Veja como seria tradicionalmente:

1
2
3
4
5
val textView = TextView(this)
textView.text = "Olá, mundo"
textView.textSize = 16f
textView.setTextColor(Color.BLACK)
textView.setPadding(16, 16, 16, 16)

Percebe como você está repetindo textView o tempo todo? Com apply fica muito mais limpo:

1
2
3
4
5
6
val textView = TextView(this).apply {
    text = "Olá, mundo"
    textSize = 16f
    setTextColor(Color.BLACK)
    setPadding(16, 16, 16, 16)
}

Muito mais enxuto, mais claro de entender. Você vê de cara que está configurando um TextView com várias propriedades.

Exemplo 2: Criando um Intent

Outro exemplo super comum no Android é quando você quer abrir uma segunda tela, uma Activity nova. Tradicionalmente você faria assim:

1
2
3
4
5
6
7
8
9
10
val isAdmin = true // vindo do banco de dados
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("produto_id", 123)
intent.putExtra("produto_nome", "iMac")

if (isAdmin) {
    intent.putExtra("is_admin", true)
}

startActivity(intent)

Funciona, mas olha como fica com apply:

1
2
3
4
5
6
7
8
9
10
11
val isAdmin = true // vindo do banco de dados
val intent = Intent(this, MainActivity::class.java).apply {
    putExtra("produto_id", 123)
    putExtra("produto_nome", "iMac")
    
    if (isAdmin) {
        putExtra("is_admin", true)
    }
}

startActivity(intent)

Percebe como ficou mais organizado? Toda a configuração da intenção está dentro de um bloco só. E você ainda pode usar lógica condicional ali dentro, como aquele if que eu coloquei.

Design Pattern: O padrão Builder

Você deve estar se perguntando: por que isso funciona tão bem?

A resposta está em um padrão de design chamado Builder. É um padrão de construção onde você vai configurando um objeto passo a passo e no final ele retorna ele mesmo.

Isso permite que você encadeie chamadas, tipo:

1
objeto.configurar1().configurar2().configurar3()

O apply faz exatamente isso por baixo dos panos. Ele retorna sempre o objeto ele mesmo, por isso você tem acesso contínuo às funções e propriedades.

Se você abrir o código fonte do apply, vai ver que é uma função genérica que retorna o tipo T, que é o tipo do objeto que você passou. Sempre retorna ele mesmo.

O Que Você NÃO Deve Fazer Com Apply

Agora vem a parte importante. Tem coisas que você não deveria fazer com apply, mesmo que funcionem.

Não Use Para Efeitos Colaterais

O apply foi feito para você aplicar configurações no objeto. O nome já diz: apply, aplicar.

Então não use ele para fazer coisas que não modificam o objeto, tipo imprimir valores:

1
2
3
4
// NÃO FAÇA ISSO
val intent = Intent(this, MainActivity::class.java).apply {
    println(this) // Isso funciona, mas não é elegante
}

Isso funciona tecnicamente, mas não é para isso que o apply foi criado. Você não está aplicando nada no objeto, só está imprimindo ele.

Não Use Para Iterações

Outro erro comum é usar apply para iterar sobre coleções:

1
2
3
4
// NÃO FAÇA ISSO
val lista = listOf("1", "2", "3", "4", "5", "6").apply {
    forEach { println(it) }
}

Isso também funciona, mas não é legal. Você não está modificando o objeto da lista, você está só iterando sobre ela. Use forEach diretamente, sem o apply.

O apply é para quando você quer modificar as propriedades do objeto em si, não para fazer operações sobre o conteúdo dele.

Quando Usar Apply: Checklist

Use apply quando:

  • Você está inicializando um objeto novo
  • Você precisa configurar múltiplas propriedades
  • Você quer deixar claro que está construindo/configurando algo
  • Você está seguindo o padrão builder

Não use apply quando:

  • Você só quer imprimir ou ler valores
  • Você quer iterar sobre uma coleção
  • Você não está modificando o objeto em si
  • Você está fazendo operações que não configuram o objeto

Conclusão

O apply é um recurso simples mas poderoso do Kotlin. Ele resolve a maior parte dos casos onde você precisaria repetir o nome do objeto várias vezes, deixando o código mais elegante e fácil de manter.

No desenvolvimento Android, você vai usar isso constantemente para configurar Views, criar Intents, inicializar objetos complexos. É um dos recursos que separa código Kotlin limpo de código verboso e repetitivo.

A chave é entender que o apply é para configuração de objetos, para aplicar propriedades e valores. Use ele para isso e seu código vai agradecer.

Pratique criar funções e objetos com apply, experimente em diferentes contextos. Com o tempo, vai ficar natural saber quando ele faz sentido e quando o modo tradicional é melhor.

Se você gostou e quer se aprofundar mais em Kotlin e desenvolvimento Android, eu tenho treinamentos completos onde abordo todos os fundamentos da linguagem, desde o básico até as partes mais avançadas, sempre com exemplos práticos.

Curso Android Compose

Curso Android Express (XML)

Clique em um dos links acima.