Trabajo con colas de tareas en Kotlin: guía completa para principiantes
Las colas de tareas son una de las estructuras de datos fundamentales con las que todo desarrollador se encuentra. En el lenguaje Kotlin, el trabajo con colas se implementa a través de la biblioteca estándar de colecciones, lo que hace que su uso sea simple e intuitivo. En este artículo, analizaremos en detalle qué son las colas, qué tipos de colas existen en Kotlin y cómo aplicarlas en la práctica. El material está orientado a desarrolladores principiantes que ya están familiarizados con los conceptos básicos de la sintaxis de Kotlin.
¿Qué es una cola de tareas y para qué sirve?
Una cola (Queue) es una estructura de datos que funciona según el principio FIFO (First In, First Out — «primero en entrar, primero en salir»). Imagina una cola en una tienda: el primer cliente que se pone en la cola es atendido primero. En programación, las colas se utilizan para organizar el procesamiento secuencial de datos: tareas, solicitudes al servidor, operaciones de entrada/salida, mensajes en aplicaciones de mensajería — todo esto a menudo se implementa mediante colas.
En Kotlin, la cola está representada por la interfaz Queue<T>, que hereda de Collection<T>. Los métodos principales de la cola son:
add(element)— añade un elemento al final de la cola (lanza una excepción si la cola está llena);offer(element)— añade un elemento al final de la cola (devuelvetruesi tiene éxito,falsesi falla);remove()— elimina y devuelve el primer elemento de la cola (lanza una excepción si la cola está vacía);poll()— elimina y devuelve el primer elemento (devuelvenullsi la cola está vacía);element()— devuelve el primer elemento sin eliminarlo (excepción si la cola está vacía);peek()— devuelve el primer elemento sin eliminarlo (devuelvenullsi la cola está vacía).
Se recomienda usar offer() y poll() en lugar de add() y remove(), ya que no lanzan excepciones y hacen que el código sea más seguro.
Implementaciones principales de colas en Kotlin
Kotlin (al igual que Java) proporciona varias implementaciones de la interfaz Queue. Veamos las más populares.
1. LinkedList como cola
La clase LinkedList<T> implementa la interfaz Queue y es una cola bidireccional clásica. Es adecuada para la mayoría de las tareas donde no se requieren restricciones estrictas de rendimiento.
import java.util.LinkedList
fun main() { val queue: Queue<String> = LinkedList() // Añadimos tareas a la cola queue.offer("Tarea 1: Parseo de HTML") queue.offer("Tarea 2: Envío de email") queue.offer("Tarea 3: Guardado en BD") println("Cola actual: $queue") // Procesamos las tareas while (queue.isNotEmpty()) { val task = queue.poll() println("Procesando: $task") } println("Todas las tareas procesadas. Cola vacía: ${queue.isEmpty()}")}Este código crea una cola de cadenas, añade tres tareas y luego las extrae y muestra secuencialmente. Observa: las tareas se muestran en el mismo orden en que fueron añadidas — este es el principio FIFO.
2. ArrayDeque — alternativa de alto rendimiento
ArrayDeque<T> es una implementación de cola bidireccional basada en un array. Funciona más rápido que LinkedList para la mayoría de las operaciones y utiliza menos memoria. Si no necesitas una cola bidireccional (Deque), puedes usar ArrayDeque como una cola normal.
import java.util.ArrayDeque
fun main() { val taskQueue: Queue<Int> = ArrayDeque() // Añadimos IDs de tareas for (i