O que é Channel em Kotlin?

Um Channel em Kotlin é uma estrutura para comunicação entre coroutines. Funciona como uma fila: uma coroutine envia dados pelo canal e outra recebe do outro lado. É o jeito mais seguro de trocar informações entre coroutines sem problemas de concorrência.

Se o Flow é como uma torneira (um produtor, um consumidor), o Channel é mais como um cano de comunicação bidirecional entre partes independentes do código.

Exemplo básico

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun main() = runBlocking {
    val canal = Channel<String>()

    launch {
        canal.send("Primeira mensagem")
        canal.send("Segunda mensagem")
        canal.close()
    }

    for (msg in canal) {
        println("Recebido: $msg")
    }
}

O send envia dados para o canal e o for consome. Quando o canal é fechado com close(), o loop encerra automaticamente.

Tipos de Channel

Kotlin oferece diferentes capacidades de buffer:

// Sem buffer — send suspende até alguém fazer receive
val rendezvous = Channel<Int>()

// Buffer limitado
val buffered = Channel<Int>(capacity = 10)

// Buffer ilimitado
val unlimited = Channel<Int>(Channel.UNLIMITED)

// Mantém só o último valor
val conflated = Channel<Int>(Channel.CONFLATED)

Produtor e consumidor

O padrão produtor-consumidor fica bem elegante com produce:

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*

fun CoroutineScope.produzirNumeros() = produce {
    for (i in 1..5) {
        delay(300)
        send(i)
    }
}

fun main() = runBlocking {
    val numeros = produzirNumeros()

    for (n in numeros) {
        println("Número: $n")
    }
}

Channel vs Flow

A principal diferença é que Channel é hot — ele produz dados independente de ter alguém consumindo. Já o Flow é cold — só produz quando alguém coleta.

CaracterísticaChannelFlow
TipoHotCold
ProdutoresUm ou váriosUm
ConsumidoresUmUm ou vários

Use Channel quando precisar de comunicação ativa entre coroutines. Para streams de dados reativos, prefira Flow.