Sobes.tech
Junior

Como trabalhar com coleções em Kotlin?

sobes.tech IA

Resposta da IA

Em Kotlin, as coleções representam grupos de objetos. Podem ser modificáveis (mutable) ou imutáveis (immutable).

Coleções imutáveis (Immutable):

  • O conteúdo não pode ser alterado após a criação.
  • São seguras para leitura em ambientes concorrentes.
  • Tipos básicos: List, Set, Map.
val numbers: List<Int> = listOf(1, 2, 3) // Criar uma lista imutável
// numbers.add(4) // Erro de compilação: coleção imutável

Coleções modificáveis (Mutable):

  • O conteúdo pode ser alterado (adicionar, remover, modificar elementos).
  • Não são seguras para acesso concorrente por padrão (é necessária sincronização manual).
  • Tipos básicos: MutableList, MutableSet, MutableMap.
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3) // Criar uma lista modificável
mutableNumbers.add(4) // Adicionar elemento
mutableNumbers.remove(2) // Remover elemento

Tipos principais de coleções:

  • List: Coleção ordenada que permite duplicados. Acesso por índice.
    val names: List<String> = listOf("Alice", "Bob", "Alice")
    println(names[0]) // "Alice"
    
  • Set: Coleção não ordenada que não permite duplicados. Os elementos são únicos.
    val uniqueNumbers: Set<Int> = setOf(1, 2, 2, 3)
    println(uniqueNumbers) // [1, 2, 3]
    
  • Map: Coleção de pares chave-valor. Cada chave é única.
    val ages: Map<String, Int> = mapOf("Alice" to 30, "Bob" to 25)
    println(ages["Alice"]) // 30
    

Funções de extensão para trabalhar com coleções (funções de ordem superior):

Kotlin oferece muitas funções de extensão poderosas para manipular coleções:

  • filter: Cria uma nova coleção contendo apenas os elementos que satisfazem um predicado.
    val evenNumbers = numbers.filter { it % 2 == 0 } // [2]
    
  • map: Transforma cada elemento em um novo elemento, criando uma nova coleção.
    val squaredNumbers = numbers.map { it * it } // [1, 4, 9]
    
  • forEach: Executa uma ação para cada elemento.
    numbers.forEach { println(it) } // Imprime 1, 2, 3 linha por linha
    
  • reduce: Combina todos os elementos em um único valor usando uma operação.
    val sum = numbers.reduce { acc, i -> acc + i } // 6
    
  • fold: Semelhante a reduce, mas aceita um valor inicial.
    val sumWithInitial = numbers.fold(10) { acc, i -> acc + i } // 16 (10 + 1 + 2 + 3)
    
  • sortedBy: Ordena a coleção por um valor obtido de cada elemento.
    val sortedNames = listOf("Charlie", "Alice", "Bob").sortedBy { it } // [Alice, Bob, Charlie]
    
  • groupBy: Agrupa os elementos por uma chave obtida de cada elemento.
    val groupedNumbers = numbers.groupBy { if (it % 2 == 0) "even" else "odd" } // {odd=[1, 3], even=[2]}
    

Conversão entre tipos de coleções:

É fácil converter um tipo de coleção em outro, bem como entre versões modificáveis e imutáveis:

val mutableList: MutableList<Int> = listOf(1, 2, 3).toMutableList()
val immutableList: List<Int> = mutableListOf(4, 5, 6).toList()

Trabalhar com coleções em Kotlin é bastante facilitado pela riqueza da biblioteca padrão e pelas funções de extensão.