Introdução: O paradoxo da lista vazia em Kotlin
\n\nImagine: você está programando em Kotlin e precisa criar uma lista que será preenchida dinamicamente. Você sabe que List é uma coleção imutável e que MutableList é o que o médico receitou. Mas assim que você escreve val list = MutableList(), o compilador dá um erro. Familiar?
Esta pergunta é uma das mais populares no Stack Overflow entre iniciantes em Kotlin (e não só). Milhares de desenvolvedores tropeçam no mesmo obstáculo: como inicializar corretamente um MutableList vazio? Parece um detalhe, mas sem isso nenhum algoritmo dinâmico funciona.
Neste artigo, vamos abordar todas as maneiras legais de criar uma lista mutável vazia em Kotlin. Desde dicas simples até técnicas avançadas. Você descobrirá por que mutableListOf() é seu melhor amigo e ArrayList() é um companheiro antigo, mas confiável. Vamos lá!
1. Por que simplesmente MutableList() não funciona?
\n\nVamos acabar com o mito imediatamente. Se você tentar escrever:
\n\n// Erro de compilação!\nval list = MutableList()\n\nO compilador reclamará com razão. Por quê? Porque MutableList é uma interface, não uma classe concreta. Uma interface não pode ser instanciada. É como tentar criar "apenas um carro" sem especificar a marca e o modelo. Kotlin exige uma implementação concreta.
Felizmente, temos várias maneiras elegantes de contornar essa limitação.
\n\n2. A maneira mais simples: mutableListOf()
\n\nEste é o rei das listas vazias. Uma função fábrica padrão da biblioteca padrão do Kotlin:
\n\nval emptyList = mutableListOf<String>()\nprintln(emptyList) // Saída: []\nprintln(emptyList.size) // Saída: 0\n\nPor que é legal:
\n- \n
- Não precisa especificar o tipo se ele puder ser inferido do contexto \n
- Cria um
MutableListcom tipoArrayListinternamente \n - Lê-se como "crie para mim uma lista mutável a partir do nada" \n
Adicionar elementos é uma alegria:
\n\nval numbers = mutableListOf<Int>()\nnumbers.add(1)\nnumbers.add(2)\nnumbers.add(3)\nprintln(numbers) // [1, 2, 3]\n\nEste método é adequado para 90% dos casos. Lembre-se dele como o principal.
\n\n3. O clássico ArrayList() — o retorno do rei
\n\nSe você veio do Java, esta maneira parecerá familiar. Kotlin é totalmente compatível com o Java Collections Framework, então você pode usar ArrayList diretamente:
val list = ArrayList<String>()\nprintln(list) // []\n\nMas há um detalhe: ArrayList é uma implementação concreta da interface MutableList. Se no futuro você quiser mudar a implementação (por exemplo, para LinkedList), terá que alterar o tipo da variável. Nesse sentido, mutableListOf() é mais flexível, pois retorna um MutableList.
Quando usar ArrayList():
\n- \n
- Quando precisar de desempenho máximo (ArrayList é mais rápido que LinkedList para acesso por índice) \n
- Quando estiver trabalhando com bibliotecas Java que esperam especificamente ArrayList \n
- Quando você escolhe conscientemente uma implementação específica \n
4. A maneira esperta: MutableList(size) { defaultValue }
\n\nÀs vezes, uma lista vazia não é exatamente "vazia". Pode ser necessário criar uma lista com um tamanho pré-determinado, mas com valores vazios. Para isso, existe uma sobrecarga do construtor:
\n\n// Criando uma lista de 5 elementos, cada um é uma string vazia\nval list = MutableList(5) { "" }\nprintln(list) // [, , , , ]\nprintln(list.size) // 5\n\nEsta não é exatamente uma lista vazia, mas uma lista inicializada com "placeholders". Útil quando você sabe exatamente a quantidade de elementos, mas irá sobrescrevê-los.
\n\nPara um zero completo, use
Blogs
Book Recommendations
Leia também
Implantação de aplicação Kotlin em VPS: guia passo a passo
Clean Code em Go: princípios para escrever código legível
Tamanho da tela, janela e página em JavaScript: 5 erros fatais e como evitá-los
WebSocket em C++: aplicações em tempo real de nível avançado
Cliente HTTP em JavaScript: fazendo requisições corretamente do A ao Z