Sobes.tech
Junior

¿Cómo trabajar con colecciones en Kotlin?

sobes.tech AI

Respuesta de la IA

En Kotlin, las colecciones representan grupos de objetos. Pueden ser modificables (mutable) o inmodificables (immutable).

Colecciones inmutables (Immutable):

  • El contenido no puede ser cambiado después de su creación.
  • Son seguras para lectura en entornos concurrentes.
  • Tipos básicos: List, Set, Map.
val numbers: List<Int> = listOf(1, 2, 3) // Crear una lista inmutable
// numbers.add(4) // Error de compilación: colección inmutable

Colecciones modificables (Mutable):

  • El contenido puede ser cambiado (agregar, eliminar, modificar elementos).
  • No son seguras para acceso concurrente por defecto (se requiere sincronización manual).
  • Tipos básicos: MutableList, MutableSet, MutableMap.
val mutableNumbers: MutableList<Int> = mutableListOf(1, 2, 3) // Crear una lista modificable
mutableNumbers.add(4) // Agregar elemento
mutableNumbers.remove(2) // Eliminar elemento

Tipos principales de colecciones:

  • List: Colección ordenada que permite duplicados. Acceso por índice.
    val names: List<String> = listOf("Alice", "Bob", "Alice")
    println(names[0]) // "Alice"
    
  • Set: Colección no ordenada que no permite duplicados. Los elementos son únicos.
    val uniqueNumbers: Set<Int> = setOf(1, 2, 2, 3)
    println(uniqueNumbers) // [1, 2, 3]
    
  • Map: Colección de pares clave-valor. Cada clave es única.
    val ages: Map<String, Int> = mapOf("Alice" to 30, "Bob" to 25)
    println(ages["Alice"]) // 30
    

Funciones de extensión para trabajar con colecciones (funciones de orden superior):

Kotlin ofrece muchas funciones de extensión poderosas para manipular colecciones:

  • filter: Crea una nueva colección con solo los elementos que cumplen un predicado.
    val evenNumbers = numbers.filter { it % 2 == 0 } // [2]
    
  • map: Transforma cada elemento en un nuevo elemento, creando una nueva colección.
    val squaredNumbers = numbers.map { it * it } // [1, 4, 9]
    
  • forEach: Ejecuta una acción para cada elemento.
    numbers.forEach { println(it) } // Imprime 1, 2, 3 en líneas separadas
    
  • reduce: Combina todos los elementos en un solo valor usando una operación.
    val sum = numbers.reduce { acc, i -> acc + i } // 6
    
  • fold: Similar a reduce, pero toma un valor inicial.
    val sumWithInitial = numbers.fold(10) { acc, i -> acc + i } // 16 (10 + 1 + 2 + 3)
    
  • sortedBy: Ordena la colección según un valor obtenido de cada elemento.
    val sortedNames = listOf("Charlie", "Alice", "Bob").sortedBy { it } // [Alice, Bob, Charlie]
    
  • groupBy: Agrupa los elementos por una clave obtenida de cada elemento.
    val groupedNumbers = numbers.groupBy { if (it % 2 == 0) "even" else "odd" } // {odd=[1, 3], even=[2]}
    

Conversión entre tipos de colecciones:

Se puede convertir fácilmente un tipo de colección en otro, así como entre versiones modificables e inmodificables:

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

Trabajar con colecciones en Kotlin se simplifica mucho gracias a la rica biblioteca estándar y a las funciones de extensión.