- 1

Fundamentos de Kotlin: Variables, funciones y estructuras de datos
01:47 - 2

Instalación y configuración de IntelliJ IDEA para Kotlin
11:16 - 3

Creación de proyecto Kotlin en IntelliJ y primer programa
13:47 - 4

Variables y tipos de datos básicos en Kotlin
20:58 - 5

Operadores aritméticos y módulo en Kotlin
14:28 - 6

Operadores lógicos AND, OR y NOT en programación
20:51 - 7

Manejo de valores nulos y operadores seguros en Kotlin
12:30 - 8

Lectura de datos por consola con readLine() en Kotlin
14:49 quiz de Fundamentos de Kotlin
Generics en Kotlin: tipos genéricos para código reutilizable
Clase 30 de 35 • Curso de Kotlin
Contenido del curso
- 9

Creación de funciones en Kotlin para organizar código
20:21 - 10

Condicionales en Kotlin: if/else
17:14 - 11

Estructura when de Kotlin para múltiples condiciones
17:44 - 12

Arrays y listas mutables en Kotlin: creación y manipulación
18:19 - 13

Listas inmutables y mutables en Kotlin
10:13 - 14

Ciclos for, while y do while en Kotlin para iterar colecciones
18:57 quiz de Contro de Flujo y Funciones
- 15

Creación de clases y objetos en Kotlin
17:05 - 16

Getters y setters en Kotlin: validación y propiedades calculadas
14:38 - 17

Dataclases en Kotlin: ventajas sobre clases normales
16:46 - 18

Enums en Kotlin: Constantes organizadas para casos específicos
20:33 - 19

Manejo de excepciones con Try Catch Finally en Kotlin
19:40 quiz de Programación Orientada a Objetos en Kotlin
- 20

Extension functions en Kotlin para ampliar clases existentes
18:14 - 21

Funciones de alto orden y lambdas en Kotlin
22:37 - 22

Uso de lambdas y funciones de alto orden en arrays y colecciones
10:05 - 23

Scope functions de Kotlin: let, apply y run para manipular objetos
15:30 - 24

Funciones with y also en Kotlin para operaciones múltiples
11:09 - 25

Modificadores de visibilidad y encapsulamiento en Kotlin
17:06 - 26

Interfaces y patrón repository en Kotlin para gestión de datos
20:00 quiz de Características Avanzadas de Kotlin
- 31

Creación de modelos y repositorios para simulador de emails en Kotlin
22:57 - 32

Creación de clase service para coordinar repositorios en Kotlin
18:19 - 33

Implementación de funciones avanzadas del servicio Inbox en Kotlin
21:19 - 34

Interfaz por consola para gestión de correos en Kotlin
16:50 - 35

Pruebas de funcionalidades de correo en Kotlin
07:32
La programación con Generics en Kotlin permite utilizar una misma funcionalidad a través de distintos tipos de datos, facilitando el desarrollo de código reutilizable y flexible. Entender esta característica ayuda a escribir aplicaciones más escalables y mantenibles.
¿Qué son los generics y por qué son importantes?
Los generics permiten definir funcionalidades comunes aplicables a múltiples tipos de datos. En Kotlin, se implementan utilizando un parámetro de tipo, indicado entre los símbolos < >. Proporcionan flexibilidad a tu código, al eliminar la necesidad de crear diferentes clases o funciones para cada tipo de dato que manejes.
Imagina que tienes una colección o una lista que puede almacenar strings, números enteros (Int) o incluso objetos personalizados creados por ti mismo. Los generics facilitan la implementación de estas estructuras comunes para distintos tipos de datos.
¿Cómo implementar generics en interfaces?
Utilizando interfaces puedes definir contratos generales para distintos tipos de datos, estableciendo estándares para las operaciones que desarrollas dentro de ellas. Por ejemplo, para implementar un repositorio genérico en Kotlin, creas una interfaz de la siguiente manera:
interface Repository<T> {
fun add(element: T)
fun findById(id: String): T?
fun findAll(): List<T>
}
El tipo T es genérico, permitiendo que esta interfaz gestione diversos tipos de elementos según tu necesidad.
¿Cómo implementar generics en clases?
Para implementar generics en clases, tu definición incluiría también el parámetro genérico:
class AlternativeRepository<T> {
private val items = mutableMapOf<String, T>()
fun save(id: String, element: T) {
items[id] = element
}
fun findById(id: String): T? {
return items[id]
}
fun findAll(): List<T> {
return items.values.toList()
}
}
Este enfoque te permite agregar, buscar y manipular objetos de cualquier tipo especificado en la inicialización de tu repositorio.
Diferencias entre listas y mapas (map)
Es importante mencionar que, si bien las listas almacenan elementos de manera ordenada y secuencial, los mapas utilizan pares clave-valor para almacenar información y facilitar búsquedas rápidas al implementar técnicas como el hash code.
- Listas: Ordenadas y secuenciales, ideales cuando el orden sí importa.
- Mapas: Pares clave-valor, eficientes para búsquedas rápidas y acceso directo a elementos específicos.
El ejemplo anterior utiliza mapas (MutableMap) para facilitar el manejo y búsqueda eficiente de elementos por su clave, en vez de recorrer una lista completa.
¿Cómo aplicar generics en tu proyecto?
Puedes implementar generics directamente en tu proyecto creando repositorios específicos según tu necesidad. Para inicializar un repositorio de emails, por ejemplo:
val repositoryEmails = AlternativeRepository<Email>()
repositoryEmails.save(UUID.randomUUID().toString(), Email("id", "asunto", "mensaje"))
println(repositoryEmails.findAll())
Igualmente, puedes extender esta lógica hacía otros tipos como contactos, únicamente cambiando el tipo especificado en el momento de creación del repositorio.
Te invitamos a implementar tus propias soluciones genéricas y explorar más sobre cómo adaptarlo a funciones específicas, ampliando tu capacidad para crear código eficiente y adaptable. ¿Qué otro tipo de dato te gustaría manejar con generics? ¡Comparte tus ideas y experiencias!