En este módulo, exploraremos las colecciones y los genéricos en Kotlin. Las colecciones son estructuras de datos que permiten almacenar y manipular grupos de elementos. Los genéricos, por otro lado, permiten escribir código que puede manejar diferentes tipos de datos de manera segura y eficiente.
- Introducción a las Colecciones
 
Kotlin proporciona varias colecciones estándar, como listas, conjuntos y mapas. Estas colecciones pueden ser mutables o inmutables.
1.1 Listas
Las listas son colecciones ordenadas de elementos. Kotlin ofrece List (inmutable) y MutableList (mutable).
Ejemplo de List (Inmutable)
Ejemplo de MutableList
val fruits = mutableListOf("Apple", "Banana")
fruits.add("Cherry")
println(fruits) // Output: [Apple, Banana, Cherry]1.2 Conjuntos
Los conjuntos son colecciones de elementos únicos. Kotlin ofrece Set (inmutable) y MutableSet (mutable).
Ejemplo de Set (Inmutable)
Ejemplo de MutableSet
1.3 Mapas
Los mapas son colecciones de pares clave-valor. Kotlin ofrece Map (inmutable) y MutableMap (mutable).
Ejemplo de Map (Inmutable)
Ejemplo de MutableMap
val map = mutableMapOf("name" to "John")
map["age"] = 30
println(map) // Output: {name=John, age=30}
- Genéricos
 
Los genéricos permiten que las clases y funciones operen con cualquier tipo de datos, proporcionando mayor flexibilidad y seguridad de tipos.
2.1 Clases Genéricas
Una clase genérica puede manejar diferentes tipos de datos sin necesidad de duplicar el código.
Ejemplo de Clase Genérica
class Box<T>(val value: T)
val intBox = Box(1)
val stringBox = Box("Hello")
println(intBox.value) // Output: 1
println(stringBox.value) // Output: Hello2.2 Funciones Genéricas
Las funciones genéricas permiten que una función trabaje con diferentes tipos de datos.
Ejemplo de Función Genérica
fun <T> printItem(item: T) {
    println(item)
}
printItem(1) // Output: 1
printItem("Hello") // Output: Hello2.3 Restricciones de Tipo
Puedes restringir los tipos que una clase o función genérica puede aceptar.
Ejemplo de Restricción de Tipo
fun <T : Number> sum(a: T, b: T): Double {
    return a.toDouble() + b.toDouble()
}
println(sum(1, 2)) // Output: 3.0
println(sum(1.5, 2.5)) // Output: 4.0
- Ejercicios Prácticos
 
Ejercicio 1: Crear una Lista Mutable
Crea una lista mutable de nombres y agrega tres nombres a la lista. Luego, imprime la lista.
Solución
val names = mutableListOf<String>()
names.add("Alice")
names.add("Bob")
names.add("Charlie")
println(names) // Output: [Alice, Bob, Charlie]Ejercicio 2: Crear una Clase Genérica
Crea una clase genérica Pair que almacene dos valores de cualquier tipo. Luego, crea una instancia de Pair con dos enteros y otra con dos cadenas, e imprime los valores.
Solución
class Pair<A, B>(val first: A, val second: B)
val intPair = Pair(1, 2)
val stringPair = Pair("Hello", "World")
println("Int Pair: ${intPair.first}, ${intPair.second}") // Output: Int Pair: 1, 2
println("String Pair: ${stringPair.first}, ${stringPair.second}") // Output: String Pair: Hello, World
- Resumen
 
En esta sección, hemos aprendido sobre las colecciones y los genéricos en Kotlin. Las colecciones nos permiten almacenar y manipular grupos de elementos, mientras que los genéricos nos permiten escribir código flexible y seguro. Hemos cubierto listas, conjuntos y mapas, tanto mutables como inmutables, y hemos visto cómo crear clases y funciones genéricas. Los ejercicios prácticos proporcionan una oportunidad para aplicar estos conceptos y reforzar el aprendizaje.
En el próximo módulo, exploraremos las funciones de extensión, que nos permitirán añadir nuevas funcionalidades a las clases existentes sin modificar su código original.
Curso de Programación en Kotlin
Módulo 1: Introducción a Kotlin
- Introducción a Kotlin
 - Configuración del Entorno de Desarrollo
 - Conceptos Básicos de Kotlin: Variables y Tipos de Datos
 - Flujo de Control: Condicionales y Bucles
 - Funciones y Lambdas
 
Módulo 2: Programación Orientada a Objetos en Kotlin
- Clases y Objetos
 - Herencia e Interfaces
 - Modificadores de Visibilidad
 - Clases de Datos y Clases Selladas
 - Declaraciones de Objetos y Objetos Compañeros
 
Módulo 3: Características Avanzadas de Kotlin
- Colecciones y Genéricos
 - Funciones de Extensión
 - Funciones de Orden Superior y Programación Funcional
 - Corrutinas y Programación Asíncrona
 - DSL (Lenguaje Específico de Dominio) en Kotlin
 
Módulo 4: Kotlin para Desarrollo Android
- Introducción al Desarrollo Android con Kotlin
 - Construcción de Interfaces de Usuario
 - Manejo de Entrada del Usuario
 - Redes y Almacenamiento de Datos
 - Pruebas y Depuración
 
