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]
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)
}
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
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) }
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)
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)