Explorando a Manipulação e Iteração de Coleções no Kotlin

O Kotlin foi projetado para ser totalmente interoperável com o ecossistema Java, o que permite o uso de classes tradicionais como ArrayList e HashMap. No entanto, a linguagem introduz sua própria hierarquia de coleções para oferecer mais segurança e expressividade. A principal distinção no Kotlin é a separação clara entre containers de apenas leitura (read-only) e containers mutáveis.

As três categorias fundamentais de coleções são Set (Conjuntos), List (Listas) e Map (Mapas). Por padrão, as coleções criadas são imutáveis. Para realizar operações de adição, remoção ou alteração, é necessário instanciar versões mutáveis, identificadas pelo prefixo Mutable.

Métodos Universais de Coleção

Independentemente do tipo de container, o Kotlin disponibiliza funções comuns para gerenciamento de dados:

  • isEmpty: Verifica se a coleção está vazia.
  • isNotEmpty: Verifica se há pelo menos um elemento.
  • clear: Remove todos os itens (apenas para mutáveis).
  • contains: Checa a existência de um elemento específico.
  • count() ou size: Retorna a quantidade total de itens.

Para inicialização, o Kotlin oferece funções auxiliares simplificadas:

  • Set: setOf (leitura) e mutableSetOf (mutável).
  • List: listOf (leitura) e mutableListOf (mutável).
  • Map: mapOf (leitura) e mutableMapOf (mutável).

Trabalhando com Set (Conjuntos)

Um Set é uma coleção que não permite elementos duplicados e não garante uma ordem específica. Devido à sua natureza não ordenada, não é possível acessar elementos por meio de índices. Em um MutableSet, você pode adicionar ou remover objetos, mas não pode modificar um item existente diretamente.

Formas de Iteração em Conjuntos

1. Loop for-in tradicional:

val conjuntoFrutas = mutableSetOf("Maçã", "Banana", "Laranja")

for (fruta in conjuntoFrutas) {
    println("Item disponível: $fruta")
}

2. Utilizando Iterator:

val it = conjuntoFrutas.iterator()
while (it.hasNext()) {
    val nomeFruta = it.next()
    println("Fruta via iterador: $nomeFruta")
}

3. Função forEach com Lambda:

conjuntoFrutas.forEach { 
    println("Processando: $it") 
}

Dominando List (Listas)

Diferente dos conjuntos, as listas mantêm a ordem de inserção, permitindo o acesso via índice. O MutableList oferece funcionalidades avançadas como substituição de valores e ordenação.

val numeros = mutableListOf(15, 8, 20, 5)

// Ordenação ascendente
numeros.sortBy { it }

// Acesso por índice
for (i in numeros.indices) {
    println("Posição $i contém o valor ${numeros[i]}")
}

Gerenciando Map (Mapas de Chave-Valor)

Mapas armazenam pares de dados onde cada chave é exclusiva. Se você tentar inserir uma chave já existente em um MutableMap, o valor antigo será sobrescrito pelo novo.

A inicialização pode ser feita usando a palavra-chave to ou a classe Pair:

// Usando 'to'
val estoque = mapOf("Caneta" to 50, "Lápis" to 100)

// Usando 'Pair'
val precos = mutableMapOf(Pair("Arroz", 25.0), Pair("Feijão", 9.5))

Iteração em Mapas

Ao percorrer um mapa, temos acesso direto ao objeto de entrada (Entry), que contém a chave e o valor.

// Iteração com for-in
for (entrada in precos) {
    println("Produto: ${entrada.key} custa R$ ${entrada.value}")
}

// Iteração com forEach (Requer API 24+ no Android)
precos.forEach { (produto, valor) -> 
    println("Item: $produto | Preço: $valor")
}

Embora os Sets sejam úteis para garantir unicidade, as Lists e Maps são as estruturas mais utilizadas no desenvolvimento cotidiano devido à flexibilidade no acesso e manipulação dos dados armazenados.

Tags: Kotlin Collections List set map

Publicado em 6-13 18:13 por Thomas