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.
- Principiante · 1
Hola mundo
Aquí tienes un programa simple que imprime "¡Hola, mundo!":...
Comenzar lección - Principiante · 2
Tipos básicos
Cada variable y estructura de datos en Kotlin tiene un tipo. Los tipos indican al compilador qué pue...
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 nulos cuando algo falta o no está definido. La seguridad nula detecta posible...
Comenzar lección
- Intermedio · 1
Funciones de extensión
En este capítulo verás funciones especiales de Kotlin que hacen el 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
Las interfaces declaran contratos sin implementación. Las clases las implementan con override. Puede...
Comenzar lección - Intermedio · 5
Objetos
object declara un singleton: una única instancia con nombre. object : Interface implementa interface...
Comenzar lección - Intermedio · 6
Clases abiertas y especiales
Por defecto las clases son final. Marca una clase con open para permitir herencia. Las sealed class ...
Comenzar lección - Intermedio · 7
Propiedades
Las propiedades pueden tener getters y setters personalizados. Usa field en el setter para acceder a...
Comenzar lección - Intermedio · 8
Patrones de seguridad nula
Patrones para trabajar con tipos anulables: comprobaciones inteligentes (smart casts), let para ejec...
Comenzar lección - Intermedio · 9
Bibliotecas y APIs
Kotlin puede llamar a código Java y viceversa. Las anotaciones @JvmStatic, @JvmOverloads y @JvmField...
Comenzar lección
- Avanzado · 1
Conceptos básicos de corutinas
Kotlin provides only minimal low-level APIs in its standard library to enable other libraries to uti...
Comenzar lección - Avanzado · 2
Corutinas y canales - tutorial
In this tutorial you'll learn how to use coroutines in IntelliJ IDEA to perform network requests wit...
Comenzar lección - Avanzado · 3
Cancelación y tiempos de espera
La cancelación permite detener una corutina antes de que termine. Usa el Job devuelto por launch o a...
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 corutinas se ejecutan en un CoroutineContext (Job, Dispatcher). Dispatchers.Default, IO, Main y ...
Comenzar lección - Avanzado · 6
Flujo asíncrono
Flow es un tipo que emite múltiples valores de forma asíncrona. Es cold: no hace nada hasta que se c...
Comenzar lección - Avanzado · 7
Canales
Los canales permiten enviar valores entre corutinas. Channel puede ser rendezvous, buffered o unlimi...
Comenzar lección - Avanzado · 8
Manejo de excepciones en corutinas
Las excepciones no capturadas en una corutina pueden propagarse al padre o al CoroutineExceptionHand...
Comenzar lección - Avanzado · 9
Estado mutable compartido y concurrencia
Compartir estado mutable entre corutinas puede provocar condiciones de carrera. Usa mutex, atomic ty...
Comenzar lección - Avanzado · 10
Expresión select
select permite esperar a la primera de varias operaciones suspendidas (varios Deferred o Channel). Ú...
Comenzar lección - Avanzado · 11
Depurar corutinas en IntelliJ
El depurador de corutinas del plugin de Kotlin en IntelliJ IDEA muestra las corutinas activas y susp...
Comenzar lección - Avanzado · 12
Depurar Kotlin Flow en IntelliJ
Puedes inspeccionar el flujo de datos en un Flow usando puntos de ruptura y la vista de depuración. ...
Comenzar lección - Avanzado · 13
Sealed classes & exhaustive when
A sealed class (or sealed interface) restricts which classes can extend it: every direct subclass mu...
Comenzar lección - Avanzado · 14
Data classes deep dive
A data class declares a value carrier — a class whose identity is its data, not its address. The com...
Comenzar lección - Avanzado · 15
Generics, variance & reified
A generic class or function parameterizes over a type: class Box<T>(val value: T). The compiler inst...
Comenzar lección - Avanzado · 16
Sequences: lazy collection processing
Collection operations on a List (map, filter, …) are EAGER: each step materialises a brand-new List....
Comenzar lección - Avanzado · 17
Delegation: class & property
Kotlin builds delegation into the language with the `by` keyword. There are two flavours: CLASS dele...
Comenzar lección - Avanzado · 18
Operator overloading & value classes
Kotlin lets you give meaning to operators on your own types by implementing well-named operator func...
Comenzar lección - Avanzado · 19
Enum classes: methods, companions, and beyond
Enums in Kotlin are full classes: they can have constructors, properties, methods, companion objects...
Comenzar lección - Avanzado · 20
Result & error-handling patterns
Kotlin gives you three ways to express failures: throw exceptions (familiar from Java), return null ...
Comenzar lección - Avanzado · 21
StateFlow & SharedFlow
Flow (covered earlier) is COLD: a new collector restarts the upstream. For UI state and event buses ...
Comenzar lección - Avanzado · 22
Type system extras: typealias, smart casts, contracts
Three small-but-mighty Kotlin features that make types feel friendlier: type aliases for readability...
Comenzar lección - Avanzado · 23
Testing: JUnit, kotlin.test, kotest
Three popular testing frameworks dominate Kotlin testing. They all coexist; pick one per module:...
Comenzar lección - Avanzado · 24
Building DSLs with lambdas with receiver
A DSL (domain-specific language) is a focused mini-language inside Kotlin: HTML builders (kotlinx.ht...
Comenzar lección - Avanzado · 25
Inline functions: reified, crossinline & noinline
Every higher-order function normally allocates an object for its lambda and pays a virtual call per ...
Comenzar lección - Avanzado · 26
Collection power operations
Beyond map/filter, Kotlin's standard library ships a deep toolbox of collection operators. Reaching ...
Comenzar lección - Avanzado · 27
Destructuring declarations & component functions
A destructuring declaration splits an object into several variables in one statement: val (name, age...
Comenzar lección - Avanzado · 28
Infix functions & the invoke operator
An infix function lets you call a single-parameter member or extension function without the dot and ...
Comenzar lección - Avanzado · 29
Tail-recursive functions (tailrec)
Deep recursion on the JVM risks a StackOverflowError: every call adds a stack frame. Kotlin offers `...
Comenzar lección - Avanzado · 30
Advanced generics: star-projection & bounds
This lesson builds on declaration-site variance (in/out) with the rest of Kotlin's generic toolkit: ...
Comenzar lección - Avanzado · 31
Functional programming: composition & currying
Functions are first-class values in Kotlin: you can store them in variables, pass them as arguments,...
Comenzar lección - Avanzado · 32
Comparable, Comparator & sorting idioms
Two abstractions drive ordering in Kotlin. Comparable<T> defines a type's *natural order* via compar...
Comenzar lección - Avanzado · 33
Structured concurrency: scopes & supervision
Structured concurrency is the rule that every coroutine lives inside a scope and a parent never comp...
Comenzar lección - Avanzado · 34
Contracts & smart-cast flow analysis
Kotlin's compiler tracks what it knows about a variable as code flows along — that's how smart casts...
Comenzar lección - Avanzado · 35
Type aliases & functional-type modeling
A type alias gives an existing type a new name: typealias Name = Existing. It introduces no new type...
Comenzar lección - Avanzado · 36
Function composition & pipelines
Composition is the act of gluing small functions together so the output of one feeds the input of th...
Comenzar lección - Avanzado · 37
Recursion & memoization
A recursive function solves a problem by calling itself on smaller inputs until it hits a base case....
Comenzar lección - Avanzado · 38
Flow operators & backpressure
A Flow is a cold asynchronous stream of values produced over time. Like a sequence it is lazy — noth...
Comenzar lección - Avanzado · 39
Time & Duration (kotlin.time)
kotlin.time gives you a type-safe Duration instead of bare Long milliseconds. A Duration knows its o...
Comenzar lección - Avanzado · 40
Bit manipulation & flags
Integers are sequences of bits, and Kotlin exposes named infix operators to work on them directly: `...
Comenzar lección - Avanzado · 41
Custom iterators & the iterator builder
Any type that provides an `operator fun iterator(): Iterator<T>` can be used in a `for (x in thing)`...
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
Programacion Dinamica en Kotlin: Memoizacion vs Tabulacion
La programacion dinamica (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 mas utiles de toda la programacion son la pila y la cola, y lo marav...
Comenzar lección - Avanzado · 56
Mas alla de find: patrones de busqueda binaria en Kotlin
`find` e `indexOf` recorren una coleccion elemento por elemento. Eso esta bien para una busqueda rap...
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 arboles binarios
Kotlin te entrega `List`, `MutableList`, `Map` y `Set` gratis, entonces, por que construirias una es...
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 ejecucion, y Kotlin te da herramien...
Comenzar lección - Avanzado · 61
Funciones locales, clausuras y etiquetas
Kotlin te permite declarar una funcion *dentro* de otra funcion. Estos ayudantes anidados se llaman ...
Comenzar lección - Avanzado · 62
Precondiciones Defensivas e Idiomas Cotidianos
El buen codigo Kotlin falla rapido y falla en voz alta. En lugar de dejar que un valor invalido corr...
Comenzar lección - Avanzado · 63
Numeros y conversiones: enteros, doubles y aritmetica segura
Kotlin ofrece una caja de herramientas numerica pequena 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 programacion 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 mas cortos
Un grafo es simplemente un conjunto de nodos (vertices) 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 Union de Conjuntos Disjuntos (DSU), tambien 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
Descomposicion 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 rapido 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: guia de decision 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 idiomatica 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 arbol de Jobs y la cancelacion estructurada
Un CoroutineContext es el objeto mas 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
Contrapresion, buffering, conflation y contexto en Flow
Un Flow es frio y estrictamente secuencial. Hasta que cambias algo, no hay ningun hilo extra ni buff...
Comenzar lección - Avanzado · 88
Trampas de las corrutinas: carreras, scopes, cancelacion y manejo de errores
Las corrutinas hacen que la concurrencia parezca secuencial, y por eso son peligrosas: el codigo sus...
Comenzar lección