Índices em forEach Kotlin: como não perder a posição e acelerar o código

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como obter o índice atual em forEach Kotlin: do iniciante ao profissional

\n\n

Imagine: você está programando em Kotlin, processando uma lista de usuários, e de repente percebe que precisa não apenas do elemento, mas também da sua posição na coleção. Instintivamente, você recorre ao antiquado for (i in 0 until list.size)… Pare! Em Kotlin existem formas mais elegantes e eficientes. Neste artigo, vamos analisar como obter o índice atual em forEach Kotlin, comparar o desempenho de diferentes abordagens e escolher a melhor para o seu projeto. Isto não é apenas uma tradução da documentação — é o resultado de medições reais e da experiência da comunidade Stack Overflow.

\n\n

Por que forEach sem índice é um problema?

\n\n

O list.forEach { item -> ... } padrão é conveniente, mas quando você precisa saber a posição do elemento, muitos escrevem gambiarras:

\n\n
var index = 0\nlist.forEach { item ->\n    println("$index: $item")\n    index++\n}
\n\n

Isso funciona, mas parece complicado e propenso a erros (esqueceu o incremento? tem um bug). Além disso, uma variável mutável fora do loop é uma violação do estilo funcional e um problema potencial em cenários multithread. Vamos ver as soluções corretas.

\n\n

Método 1: Usando withIndex() — simples e elegante

\n\n

A resposta mais popular no Stack Overflow é a função withIndex(). Ela retorna uma sequência de pares IndexedValue, onde cada elemento tem os campos index e value.

\n\n
val list = listOf("Kotlin", "Java", "Python")\nlist.withIndex().forEach { (index, value) ->\n    println("Elemento #$index: $value")\n}
\n\n

O que está acontecendo aqui? withIndex() cria uma sequência lazy, que envolve cada elemento em um objeto IndexedValue. A desestruturação (index, value) torna o código limpo e legível.

\n\n

Vantagens:

\n
    \n
  • Concisão — uma linha em vez de três
  • \n
  • Lazy — não cria coleções extras na memória
  • \n
  • Legibilidade — fica claro imediatamente que estamos trabalhando com índice
  • \n
\n\n

Desvantagens:

\n
    \n
  • Pequeno overhead na criação do wrapper IndexedValue (embora em 99% dos casos seja imperceptível)
  • \n
\n\n

Método 2: forEachIndexed — alternativa nativa

\n\n

Kotlin fornece a função pronta forEachIndexed, que aceita uma lambda com dois parâmetros: índice e valor.

\n\n
list.forEachIndexed { index, value ->\n    println("Posição $index: $value")\n}
\n\n

Isso é praticamente o mesmo que withIndex().forEach, mas sem uma chamada extra. A implementação interna de forEachIndexed também usa IndexedValue? Não, ela passa o índice diretamente, o que é um pouco mais rápido.

\n\n

Vantagens:

\n
    \n
  • Escrita mais curta possível
  • \n
  • Sem criação de objetos intermediários
  • \n
  • Idiomático para Kotlin
  • \n
\n\n

Desvantagens:

\n
    \n
  • Menos flexível que withIndex() — não pode ser combinado com outros operadores de encadeamento (ex: filter antes de forEach)
  • \n
\n\n

Método 3: filterIndexed — quando você precisa filtrar por índice

\n\n

Se você precisa não apenas obter o índice, mas também filtrar elementos pela sua posição, filterIndexed é a sua escolha.

\n\n
val list = listOf("a", "b", "c", "d", "e")\nval evenIndexed = list.filterIndexed { index, _ -> index % 2 == 0 }\nprintln(evenIndexed) // [a, c, e]
\n\n

Observe: o segundo parâmetro é o próprio elemento, mas nós o ignoramos usando _. Esta é uma prática padrão em Kotlin para variáveis não utilizadas.

\n\n

Vantagens:

\n
    \n
  • Flexibilidade — pode combinar filtragem e transformação
  • \n
  • Estilo funcional puro
  • \n
\n\n

Des

Blogs

Book Recommendations