Aprende Kotlin desde los fundamentos
Contenido del tour oficial de Kotlin con editor interactivo multiarchivo. Retos de práctica con ejecución y validación—aprende practicando.
Aprendamos juntos.
Pregúntame sobre este curso o por dónde empezar.
- Principiante · 1
Hola mundo
Aquí tienes un programa simple que imprime "Hello, world!":...
Comenzar lección - Principiante · 2
Tipos básicos
Cada variable y estructura de datos en Kotlin tiene un tipo. Los tipos le indican al compilador qué ...
Comenzar lección - Principiante · 3
Colecciones
Kotlin ofrece colecciones para agrupar datos: Listas (ordenadas, permiten duplicados), Conjuntos (si...
Comenzar lección - Principiante · 4
Flujo de control
Como otros lenguajes, Kotlin puede tomar decisiones según si una expresión se evalúa a true. Esas ex...
Comenzar lección - Principiante · 5
Funciones
Puedes declarar funciones en Kotlin con la palabra clave fun. Los parámetros van en (), cada uno con...
Comenzar lección - Principiante · 6
Clases
Kotlin soporta programación orientada a objetos con clases y objetos. Los objetos almacenan datos; l...
Comenzar lección - Principiante · 7
Seguridad nula
Kotlin permite valores null cuando algo falta o todavía no se ha establecido. La null safety detecta...
Comenzar lección
- Intermedio · 1
Funciones de extensión
En este capítulo explorarás funciones especiales de Kotlin que hacen tu código más conciso y legible...
Comenzar lección - Intermedio · 2
Funciones de alcance
En este capítulo ampliarás tu conocimiento de las funciones de extensión para aprender a usar funcio...
Comenzar lección - Intermedio · 3
Expresiones lambda con receptor
En este capítulo aprenderás a usar receptores con otro tipo de función, las expresiones lambda, y có...
Comenzar lección - Intermedio · 4
Clases e interfaces
En el tour para principiantes aprendiste a usar clases y data classes para almacenar datos. Tarde o ...
Comenzar lección - Intermedio · 5
Objetos
En este capítulo ampliarás tu comprensión de las clases explorando las declaraciones de objeto. Este...
Comenzar lección - Intermedio · 6
Clases abiertas y especiales
En este capítulo aprenderás sobre las clases open, cómo funcionan con las interfaces y otros tipos e...
Comenzar lección - Intermedio · 7
Propiedades
Las propiedades tienen get() y set() por defecto (getters y setters) que usan un backing field para ...
Comenzar lección - Intermedio · 8
Patrones de seguridad nula
Este capítulo cubre casos de uso comunes de null safety y cómo sacarles el máximo partido....
Comenzar lección - Intermedio · 9
Bibliotecas y APIs
Usa bibliotecas y APIs existentes para dedicar más tiempo a programar y menos a reinventar la rueda....
Comenzar lección
- Avanzado · 1
Conceptos básicos de corutinas
Kotlin proporciona en su biblioteca estándar solo APIs mínimas de bajo nivel para que otras bibliote...
Comenzar lección - Avanzado · 2
Corutinas y canales - tutorial
En este tutorial aprenderás a usar corrutinas en IntelliJ IDEA para hacer peticiones de red sin bloq...
Comenzar lección - Avanzado · 3
Cancelación y tiempos de espera
La cancelación te permite detener una corrutina antes de que termine. Detiene el trabajo que ya no s...
Comenzar lección - Avanzado · 4
Componer funciones de suspensión
Esta sección cubre distintas formas de componer funciones de suspensión....
Comenzar lección - Avanzado · 5
Contexto de corutinas y despachadores
Las corrutinas siempre se ejecutan en algún contexto representado por un valor de tipo CoroutineCont...
Comenzar lección - Avanzado · 6
Flujo asíncrono
Una función suspend devuelve un único valor de forma asíncrona. Para devolver varios valores calcula...
Comenzar lección - Avanzado · 7
Canales
Deferred transfiere un único valor entre corrutinas. Los canales transfieren un flujo de valores....
Comenzar lección - Avanzado · 8
Manejo de excepciones en corutinas
Esta sección trata el manejo de excepciones y la cancelación provocada por excepciones. Una corrutin...
Comenzar lección - Avanzado · 9
Estado mutable compartido y concurrencia
Las corrutinas que se ejecutan en paralelo (p. ej., con Dispatchers.Default) se enfrentan a los mism...
Comenzar lección - Avanzado · 10
Expresión select
La expresión select te permite esperar varias funciones suspend a la vez y usar el primer resultado ...
Comenzar lección - Avanzado · 11
Depurar corutinas en IntelliJ
Este tutorial muestra cómo crear corrutinas de Kotlin y depurarlas en IntelliJ IDEA. Ya deberías con...
Comenzar lección - Avanzado · 12
Depurar Kotlin Flow en IntelliJ
Este tutorial muestra cómo crear un Flow de Kotlin y depurarlo en IntelliJ IDEA. Ya deberías conocer...
Comenzar lección - Avanzado · 13
Clases sealed y when exhaustivo
Una sealed class (o sealed interface) restringe qué clases pueden extenderla: cada subclase directa ...
Comenzar lección - Avanzado · 14
Data classes a fondo
Una data class declara un portador de valores: una clase cuya identidad son sus datos, no su direcci...
Comenzar lección - Avanzado · 15
Genéricos, varianza y reified
Una clase o función genérica se parametriza sobre un tipo: class Box<T>(val value: T). El compilador...
Comenzar lección - Avanzado · 16
Secuencias: procesamiento perezoso de colecciones
Las operaciones de colección sobre una List (map, filter, …) son ANSIOSAS (eager): cada paso materia...
Comenzar lección - Avanzado · 17
Delegación: de clase y de propiedad
Kotlin integra la delegación en el lenguaje con la palabra clave `by`. Hay dos variantes: la delegac...
Comenzar lección - Avanzado · 18
Sobrecarga de operadores y value classes
Kotlin te permite dar significado a los operadores sobre tus propios tipos implementando funciones d...
Comenzar lección - Avanzado · 19
Enum classes: métodos, companions y mucho más
Los enums en Kotlin son clases completas: pueden tener constructores, propiedades, métodos, companio...
Comenzar lección - Avanzado · 20
Result y patrones de manejo de errores
Kotlin te da tres formas de expresar fallos: lanzar excepciones (algo familiar de Java), devolver nu...
Comenzar lección - Avanzado · 21
StateFlow y SharedFlow
Flow (visto antes) es FRÍO: un nuevo recolector reinicia el upstream. Para el estado de la UI y los ...
Comenzar lección - Avanzado · 22
Extras del sistema de tipos: typealias, smart casts y contratos
Tres funcionalidades de Kotlin pequeñas pero poderosas que hacen que los tipos resulten más amigable...
Comenzar lección - Avanzado · 23
Pruebas: JUnit, kotlin.test y kotest
Tres frameworks de testing populares dominan las pruebas en Kotlin. Todos conviven; elige uno por mó...
Comenzar lección - Avanzado · 24
Construir DSLs con lambdas con receptor
Un DSL (lenguaje específico de dominio) es un minilenguaje enfocado dentro de Kotlin: builders de HT...
Comenzar lección - Avanzado · 25
Funciones inline: reified, crossinline y noinline
Normalmente, cada función de orden superior crea un objeto para su lambda y paga una llamada virtual...
Comenzar lección - Avanzado · 26
Operaciones avanzadas con colecciones
Más allá de map/filter, la biblioteca estándar de Kotlin trae una caja de herramientas muy completa ...
Comenzar lección - Avanzado · 27
Declaraciones de desestructuración y funciones component
Una declaración de desestructuración divide un objeto en varias variables en una sola sentencia: val...
Comenzar lección - Avanzado · 28
Funciones infix y el operador invoke
Una función infix te permite llamar a una función miembro o de extensión de un solo parámetro sin el...
Comenzar lección - Avanzado · 29
Funciones con recursión de cola (tailrec)
La recursión profunda en la JVM corre el riesgo de provocar un StackOverflowError: cada llamada añad...
Comenzar lección - Avanzado · 30
Genéricos avanzados: proyección estrella y límites
Esta lección parte de la varianza en el sitio de declaración (in/out) y añade el resto de las herram...
Comenzar lección - Avanzado · 31
Programación funcional: composición y currying
En Kotlin, las funciones son valores de primera clase: puedes guardarlas en variables, pasarlas como...
Comenzar lección - Avanzado · 32
Comparable, Comparator y formas idiomáticas de ordenar
Dos abstracciones rigen el orden en Kotlin. Comparable<T> define el *orden natural* de un tipo media...
Comenzar lección - Avanzado · 33
Concurrencia estructurada: ámbitos y supervisión
La concurrencia estructurada es la regla según la cual cada corrutina vive dentro de un ámbito (scop...
Comenzar lección - Avanzado · 34
Contratos y análisis de flujo para smart casts
El compilador de Kotlin rastrea lo que sabe sobre una variable a medida que avanza el flujo del códi...
Comenzar lección - Avanzado · 35
Alias de tipo y modelado con tipos funcionales
Un alias de tipo le da un nombre nuevo a un tipo existente: typealias Name = Existing. No introduce ...
Comenzar lección - Avanzado · 36
Composición de funciones y pipelines
La composición consiste en unir funciones pequeñas de modo que la salida de una alimente la entrada ...
Comenzar lección - Avanzado · 37
Recursión y memoización
Una función recursiva resuelve un problema llamándose a sí misma con entradas más pequeñas hasta lle...
Comenzar lección - Avanzado · 38
Operadores de Flow y backpressure
Un Flow es un flujo asíncrono frío de valores producidos a lo largo del tiempo. Como una secuencia, ...
Comenzar lección - Avanzado · 39
Tiempo y Duration (kotlin.time)
kotlin.time te da un Duration con seguridad de tipos en lugar de simples milisegundos en un Long. Un...
Comenzar lección - Avanzado · 40
Manipulación de bits y flags
Los enteros son secuencias de bits, y Kotlin expone operadores infix con nombre para trabajar direct...
Comenzar lección - Avanzado · 41
Iteradores personalizados y el builder iterator
Cualquier tipo que proporcione un `operator fun iterator(): Iterator<T>` se puede usar en un bucle `...
Comenzar lección - Avanzado · 42
Fundamentos de Regex en Kotlin
Las expresiones regulares en Kotlin viven por completo en la biblioteca estándar a través de la clas...
Comenzar lección - Avanzado · 43
Excepciones a fondo: try/catch, errores personalizados, Nothing y Result
Los programas fallan. Una cadena numérica está mal formada, falta un archivo, un saldo es demasiado ...
Comenzar lección - Avanzado · 44
Igualdad y hashing: == vs ===, el contrato equals/hashCode
Kotlin distingue dos tipos de igualdad, y confundirlos es una fuente clásica de errores. La igualdad...
Comenzar lección - Avanzado · 45
Clases anidadas, internas, anónimas y locales
Kotlin te permite declarar una clase dentro de otra clase, o incluso dentro del cuerpo de una funció...
Comenzar lección - Avanzado · 46
Agrupación y agregación
Los programas reales rara vez quieren una lista en bruto; quieren un resumen de ella: cuántas ventas...
Comenzar lección - Avanzado · 47
Patrones algorítmicos idiomáticos en Kotlin
El buen código de competencia y de entrevistas rara vez se trata de trucos ingeniosos. Se trata de r...
Comenzar lección - Avanzado · 48
Maestría de Strings: Plantillas, Builders y Magia de Caracteres
Un `String` de Kotlin es una secuencia inmutable de caracteres: una vez creado no cambia nunca, y ca...
Comenzar lección - Avanzado · 49
Rangos y progresiones: contar al estilo Kotlin
Un rango en Kotlin es un valor pequeño pero poderoso que representa "todos los elementos desde aquí ...
Comenzar lección - Avanzado · 50
Constructores de colecciones: buildList, buildMap, buildSet y buildString
Kotlin ama la inmutabilidad, pero los datos reales casi nunca llegan listos. Iteras, ramificas, omit...
Comenzar lección - Avanzado · 51
Dominando `when`: la navaja suiza de las ramas en Kotlin
Si `if` es un interruptor de luz, el `when` de Kotlin es todo un panel de control. Nació como un `sw...
Comenzar lección - Avanzado · 52
Anotaciones e introspección en tiempo de ejecución con la librería estándar
Las anotaciones son metadatos que adjuntas a tu código: pequeñas etiquetas estructuradas que viajan ...
Comenzar lección - Avanzado · 53
Programación Dinámica en Kotlin: Memoización vs Tabulación
La programación dinámica (DP) suena intimidante, pero la idea es casi vergonzosamente simple: resuel...
Comenzar lección - Avanzado · 54
Backtracking en Kotlin: Elegir, Explorar, Deshacer
El backtracking es el arte de construir una solución una decisión a la vez, y deshacer silenciosamen...
Comenzar lección - Avanzado · 55
Pilas y colas con ArrayDeque
Dos de las estructuras de datos más útiles de toda la programación son la pila y la cola, y lo marav...
Comenzar lección - Avanzado · 56
Más allá de find: patrones de búsqueda binaria en Kotlin
`find` e `indexOf` recorren una colección elemento por elemento. Eso está bien para una búsqueda ráp...
Comenzar lección - Avanzado · 57
Cuadrículas y matrices: arreglos 2D, transposición, rotación e inundación
Las cuadrículas están en todas partes en el software real: los píxeles de una imagen, las casillas d...
Comenzar lección - Avanzado · 58
Construye tus propias estructuras: listas enlazadas y árboles binarios
Kotlin te entrega `List`, `MutableList`, `Map` y `Set` gratis, entonces, ¿por qué construirías una e...
Comenzar lección - Avanzado · 59
Mapas en Kotlin a fondo: búsquedas, caché y transformaciones
Un mapa es el diccionario de Kotlin: una colección de pares clave-valor donde cada clave es única. C...
Comenzar lección - Avanzado · 60
Comprobaciones de tipo, casts y smart casts
Cada valor en un programa Kotlin lleva su tipo real en tiempo de ejecución, y Kotlin te da herramien...
Comenzar lección - Avanzado · 61
Funciones locales, clausuras y etiquetas
Kotlin te permite declarar una función *dentro* de otra función. Estos ayudantes anidados se llaman ...
Comenzar lección - Avanzado · 62
Precondiciones Defensivas e Idiomas Cotidianos
El buen código Kotlin falla rápido y falla en voz alta. En lugar de dejar que un valor inválido corr...
Comenzar lección - Avanzado · 63
Números y conversiones: enteros, doubles y aritmética segura
Kotlin ofrece una caja de herramientas numérica pequeña y precisa, y elegir el tipo correcto es la p...
Comenzar lección - Avanzado · 64
Conjuntos y álgebra de conjuntos en Kotlin
Un `Set` es la colección de Kotlin para un saco de valores *distintos*. Mientras que una `List` guar...
Comenzar lección - Avanzado · 65
Patrones de hashing para entrevistas en Kotlin
Casi toda entrevista de programación termina dependiendo de una pregunta: ¿sabes cambiar memoria por...
Comenzar lección - Avanzado · 66
Clásicos voraces de entrevista en Kotlin
Un algoritmo voraz (greedy) construye una solución paso a paso, tomando siempre la opción que parece...
Comenzar lección - Avanzado · 67
Grafos en Kotlin: listas de adyacencia, BFS, DFS y caminos más cortos
Un grafo es simplemente un conjunto de nodos (vértices) conectados por aristas, y es una de las estr...
Comenzar lección - Avanzado · 68
Heaps y colas de prioridad en Kotlin
Un heap es un árbol binario almacenado en un arreglo donde cada padre está ordenado respecto a sus h...
Comenzar lección - Avanzado · 69
Problemas de intervalos en entrevistas con Kotlin
Los problemas de intervalos son una de las familias de preguntas más fiables en entrevistas de progr...
Comenzar lección - Avanzado · 70
Conjuntos Disjuntos (Union-Find) en Kotlin
La Unión de Conjuntos Disjuntos (DSU), también llamada Union-Find, es una de esas estructuras de dat...
Comenzar lección - Avanzado · 71
Fan-out / Fan-in con Corrutinas y Channels
Imagina una pila de trabajo por procesar: 10.000 miniaturas de imagen por generar, un lote de petici...
Comenzar lección - Avanzado · 72
Limitar la Concurrencia: Semáforos y Pools Acotados de Workers
Lo primero que todo desarrollador hace con corrutinas es expandirse: tomar una lista de 10.000 IDs d...
Comenzar lección - Avanzado · 73
Descomposición paralela: async + awaitAll en Dispatchers.Default
Algunos problemas son 'vergonzosamente paralelos': puedes partir la entrada en piezas independientes...
Comenzar lección - Avanzado · 74
Llamadas suspend resilientes: reintentos con backoff y timeouts
Los sistemas reales son inestables. Un corte de red, un servicio momentáneamente sobrecargado o una ...
Comenzar lección - Avanzado · 75
Limitar el trabajo de las corrutinas: limitadores de tasa y descarte de carga
Los sistemas reales casi nunca te dejan ir tan rápido como quieres. Una pasarela de pagos permite 10...
Comenzar lección - Avanzado · 76
Single-Flight: deduplicar solicitudes idénticas concurrentes
Imagina un fallo de caché que llega para la misma clave desde diez corrutinas a la vez. Una pantalla...
Comenzar lección - Avanzado · 77
apply vs let: guía de decisión para las funciones de alcance de Kotlin
Las cinco funciones de alcance de Kotlin (let, run, with, apply, also) no te dan poderes nuevos. Ree...
Comenzar lección - Avanzado · 78
Actualizaciones inmutables con copy() de data class
En Kotlin, la forma idiomática de "cambiar" una data class es no cambiarla en absoluto. En lugar de ...
Comenzar lección - Avanzado · 79
Construir objetos con fluidez usando apply
`apply` de Kotlin es una de las cinco funciones de alcance y tiene un trabajo muy concreto: ejecuta ...
Comenzar lección - Avanzado · 80
Kotlin en Producción: Guía de Campo de las Funciones que Realmente Dominan los Backends Reales
Kotlin es un lenguaje grande, pero una base de código real se apoya solo en un subconjunto pequeño y...
Comenzar lección - Avanzado · 81
Targets de sitio de uso en anotaciones: @field:, @get:, @set:, @param:
En la mayoría de los lenguajes una anotación tiene exactamente un lugar al que adherirse. En Kotlin ...
Comenzar lección - Avanzado · 82
El kit de pruebas de Kotlin/JVM: JUnit 5, MockK, StepVerifier y Testcontainers
Cuando llevas Kotlin a producción en la JVM, tus pruebas se apoyan en un stack pequeño y muy conocid...
Comenzar lección - Avanzado · 83
Por dentro de suspend: CPS, máquinas de estados y por qué las corrutinas no bloquean hilos
La JVM no tiene una noción nativa de "suspend". A nivel de bytecode no existe ninguna instrucción qu...
Comenzar lección - Avanzado · 84
CoroutineContext, el árbol de Jobs y la cancelación estructurada
Un CoroutineContext es el objeto más importante de la concurrencia estructurada y, sin embargo, es c...
Comenzar lección - Avanzado · 85
Dispatchers de corrutinas en profundidad: Default, IO, Unconfined, Main y confinamiento de hilos
Un dispatcher es la parte del contexto de una corrutina que responde a una sola pregunta: ¿en qué hi...
Comenzar lección - Avanzado · 86
Flujos Fríos vs Calientes: Internals de Flow, StateFlow y SharedFlow
Un Flow frío es una receta, no un proceso en ejecución. Escribir flow { ... } crea un objeto que cap...
Comenzar lección - Avanzado · 87
Contrapresión, buffering, conflation y contexto en Flow
Un Flow es frío y estrictamente secuencial. Hasta que cambias algo, no hay ningún hilo extra ni buff...
Comenzar lección - Avanzado · 88
Trampas de las corrutinas: carreras, scopes, cancelación y manejo de errores
Las corrutinas hacen que la concurrencia parezca secuencial, y por eso son peligrosas: el código sus...
Comenzar lección