Trabalho com filas de tarefas em Kotlin: guia completo para iniciantes
Filas de tarefas são uma das estruturas de dados fundamentais que todo desenvolvedor encontra. Na linguagem Kotlin, o trabalho com filas é implementado através da biblioteca padrão de coleções, tornando seu uso simples e intuitivo. Neste artigo, vamos detalhar o que são filas, quais tipos de filas existem em Kotlin e como aplicá-las na prática. O material é voltado para desenvolvedores iniciantes que já conhecem os fundamentos da sintaxe do Kotlin.
O que é uma fila de tarefas e para que serve?
Uma fila (Queue) é uma estrutura de dados que opera segundo o princípio FIFO (First In, First Out — "o primeiro a entrar é o primeiro a sair"). Imagine uma fila em uma loja: o primeiro cliente que entra na fila é atendido primeiro. Na programação, filas são usadas para organizar o processamento sequencial de dados: tarefas, requisições a servidores, operações de entrada/saída, mensagens em aplicativos de mensagens — tudo isso é frequentemente implementado através de filas.
Em Kotlin, a fila é representada pela interface Queue<T>, que herda de Collection<T>. Os principais métodos da fila são:
add(element)— adiciona um elemento ao final da fila (lança exceção se a fila estiver cheia);offer(element)— adiciona um elemento ao final da fila (retornatrueem caso de sucesso,falseem caso de falha);remove()— remove e retorna o primeiro elemento da fila (lança exceção se a fila estiver vazia);poll()— remove e retorna o primeiro elemento (retornanullse a fila estiver vazia);element()— retorna o primeiro elemento sem removê-lo (exceção se a fila estiver vazia);peek()— retorna o primeiro elemento sem removê-lo (retornanullse a fila estiver vazia).
Recomenda-se usar offer() e poll() em vez de add() e remove(), pois eles não lançam exceções e tornam o código mais seguro.
Principais implementações de filas em Kotlin
Kotlin (assim como Java) oferece várias implementações da interface Queue. Vamos analisar as mais populares.
1. LinkedList como fila
A classe LinkedList<T> implementa a interface Queue e é uma fila bidirecional clássica. Ela é adequada para a maioria das tarefas onde não são necessárias restrições rigorosas de desempenho.
import java.util.LinkedList
fun main() { val queue: Queue<String> = LinkedList() // Adicionamos tarefas à fila queue.offer("Tarefa 1: Parse de HTML") queue.offer("Tarefa 2: Envio de email") queue.offer("Tarefa 3: Salvamento no BD") println("Fila atual: $queue") // Processamos as tarefas while (queue.isNotEmpty()) { val task = queue.poll() println("Processando: $task") } println("Todas as tarefas processadas. Fila vazia: ${queue.isEmpty()}")}Este código cria uma fila de strings, adiciona três tarefas e, em seguida, extrai e exibe sequencialmente. Observe: as tarefas são exibidas na mesma ordem em que foram adicionadas — este é o princípio FIFO.
2. ArrayDeque — alternativa de alto desempenho
ArrayDeque<T> é uma implementação de fila bidirecional baseada em array. Ela é mais rápida que LinkedList para a maioria das operações e usa menos memória. Se você não precisar de uma fila bidirecional (Deque), pode usar ArrayDeque como uma fila comum.
import java.util.ArrayDeque
fun main() { val taskQueue: Queue<Int> = ArrayDeque() // Adicionamos IDs de tarefas for (i