Funções inline: eliminando a sobrecarga de lambdas
Marque funções como inline para evitar a criação de objetos para parâmetros lambda.
Funções inline: eliminando a sobrecarga de lambdas é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.
O que é uma função inline
Normalmente, uma lambda passada para uma função é compilada em uma classe anônima. Cada chamada aloca um novo objeto, o que custa memória e tempo. A palavra-chave inline instrui o compilador a copiar o corpo da função (e seus argumentos lambda) diretamente para o local da chamada.
Declarando inline
Adicione o modificador inline antes de fun:
inline fun measureTime(block: () -> Unit): Long {
val start = System.nanoTime()
block()
return System.nanoTime() - start
}Como o compilador reescreve a chamada
Uma chamada como measureTime { doWork() } se transforma, no nível do código de bytes, no corpo de measureTime colado no local da chamada — nenhum objeto lambda é alocado.
Quando usar inline
Use inline quando:
- A função recebe um ou mais parâmetros lambda
- Ela é chamada com frequência em caminhos críticos (laços fechados e funções componíveis)
- Você precisa de parâmetros de tipo
reified(abordados a seguir)
Exemplo de avaliação de desempenho
Sem inline, cada chamada de uma função de ordem superior aloca um objeto lambda. Com ele, a JVM vê código sequencial — sem alocação e sem despacho virtual.
inline fun repeat(n: Int, block: () -> Unit) {
for (i in 0 until n) block()
}Retornos não locais
Um benefício importante das funções inline: a lambda pode usar return para sair da função envolvente, e não apenas da lambda. Isso é chamado de retorno não local.
inline fun forEach(list: List<Int>, block: (Int) -> Unit) {
for (item in list) block(item)
}
fun findFirst(list: List<Int>): Int {
forEach(list) { if (it > 5) return it } // returns from findFirst
return -1
}Limitações de inline
Funções inline não podem ser armazenadas em variáveis nem passadas como objetos, pois não existem como entidades de primeira classe durante a execução. Não é possível chamar f(::measureTime) quando f espera uma referência de função com essa assinatura.
Inserção em linha de cadeias de coleções
As funções da biblioteca padrão map, filter, forEach etc. são todas inline. Por isso, encadeá-las não cria objetos de fechamento adicionais para cada elemento.
val result = (1..1_000_000)
.filter { it % 2 == 0 } // inline
.map { it * it } // inline
.take(10)Compromisso com o tamanho do código
Cada local de chamada recebe uma cópia do código inserido. Se o corpo da função for grande e for chamado de muitos lugares, o tamanho do código de bytes aumentará. Prefira inline para lambdas pequenas chamadas com frequência.
Interação com companion e funções de nível superior
inline funciona em funções de nível superior e funções-membro. Ele não funciona em propriedades nem em construtores. A função precisa estar visível no local da chamada (geralmente ser public ou internal).
Exemplos da biblioteca padrão
Funções que você já conhece e que são inline: let, run, apply, also, with, use, synchronized, lazy (variante com bloco). O modificador inline é o que torna suas lambdas livres de custo.
Verificação rápida
Qual é o principal benefício de marcar uma função de ordem superior como inline?
Recapitulação: funções inline
Principais conclusões:
inlineelimina a alocação de objetos lambda- Permite retornos não locais a partir de lambdas
- É necessário para parâmetros de tipo
reified - É melhor para funções de ordem superior pequenas e chamadas com frequência
- As funções de escopo da biblioteca padrão são todas
inline
Perguntas Frequentes
A aula “Funções inline: eliminando a sobrecarga de lambdas” é grátis?
Sim — o texto completo de “Funções inline: eliminando a sobrecarga de lambdas” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.
O que vou aprender em “Funções inline: eliminando a sobrecarga de lambdas”?
Marque funções como inline para evitar a criação de objetos para parâmetros lambda. Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Kotlin Academy?
Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Funções inline: eliminando a sobrecarga de lambdas”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Kotlin Academy?
Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Funções inline: eliminando a sobrecarga de lambdas
- Modificadores noinline e crossinline
- Parâmetros de tipo reified: acessando T em tempo de execução
- Padrões práticos com reified: análise, DI e serialização