DEV Community

Isaias Velasquez
Isaias Velasquez

Posted on

How to escolher entre Flow e Sequence no Kotlin

Flow e Sequence sao duas formas de trabalhar com colecoes lazy em Kotlin. Cada uma tem seu lugar. A escolha errada pode causar travamentos na UI ou codigo mais lento que o necessario.

Sequence trabalha com blocos sincronos. Flow e para fluxos assincronos com coroutines.

Veja um exemplo com Sequence:

val numeros = sequenceOf(1, 2, 3, 4, 5)
val resultado = numeros
    .map { it * 2 }
    .filter { it > 5 }
    .toList()
println(resultado) // [6, 8, 10]
Enter fullscreen mode Exit fullscreen mode

O Sequence executa tudo no mesmo thread. E lazy: so processa os elementos quando voce chama toList().

Flow faz a mesma coisa, mas com suporte a async:

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking

runBlocking {
    val numeros = flowOf(1, 2, 3, 4, 5)
    val resultado = numeros
        .map { it * 2 }
        .filter { it > 5 }
        .toList()
    println(resultado)
}
Enter fullscreen mode Exit fullscreen mode

A diferenca principal aparece quando voce precisa de operacoes assincronas:

suspend fun buscarPreco(id: Int): Double {
    delay(100) // simulando chamada de API
    return id * 1.5
}

// COM FLOW (funciona)
val precos = (1..5).asFlow()
    .map { buscarPreco(it) }
    .toList()

// COM SEQUENCE (NAO compila - nao pode chamar suspend)
// val precos = (1..5).asSequence()
//     .map { buscarPreco(it) } // erro de compilacao
Enter fullscreen mode Exit fullscreen mode

O Flow tambem oferece flowOn para mudar de dispatcher:

flow {
    for (i in 1..5) {
        delay(100)
        emit(i)
    }
}
    .flowOn(Dispatchers.IO)
    .collect { println(it) }
Enter fullscreen mode Exit fullscreen mode

Sem flowOn, o emit rodaria no dispatcher do collect.

Para dados que mudam ao longo do tempo, Flow e mais adequado com StateFlow:

val contador = MutableStateFlow(0)

contador.value = 1
contador.value = 2

contador.collect { println(it) } // imprime 2 (valor atual)
Enter fullscreen mode Exit fullscreen mode

StateFlow sempre emite o ultimo valor para novos coletores. Sequence nao tem esse conceito.

Use Sequence para processamento puramente computacional e sincrono. Use Flow quando houver I/O, rede, banco de dados ou qualquer operacao assincrona.

Para colecoes pequenas (menos de 1000 itens) sem operacoes pesadas, usar List com map e filter comuns e mais simples e nao tem diferenca pratica.

That's all for now.
Thanks for reading!

Top comments (0)