Différence entre collect() et first() sur un Flow
💡 Sujet
En Kotlin Coroutines, il existe plusieurs façons de consommer un Flow.
Deux opérateurs terminaux reviennent souvent : collect() et first().
Bien qu'ils déclenchent tous deux le flow, ils ne répondent pas aux mêmes besoins.
🔄 collect() : L'écoute continue
collect() est l'opérateur standard.
- Il démarre le flow et reste "ouvert" tant que le flow est actif.
- Il exécute un bloc de code pour chaque valeur émise.
- Il est suspendant et ne rend la main que lorsque le flow se termine (ce qui peut ne jamais arriver avec un
StateFlowouSharedFlow).
👉 Usage : Idéal pour s'abonner à un flux de données qui change dans le temps (ex: position GPS, état de l'UI).
// Bloque la coroutine tant que le flow émet
myFlow.collect { value ->
println("Nouvelle valeur reçue : $value")
}🎯 first() : L'écoute ponctuelle (One-shot)
first() est conçu pour récupérer une valeur unique.
- Il démarre le flow, attend la toute première valeur, puis annule immédiatement la collecte.
- Il renvoie directement la valeur (ex:
Boolean,String) au lieu d'exécuter une lambda. - Il simplifie grandement la syntaxe quand on sait que le flow n'émettra qu'une seule fois (ou qu'on se fiche des suivantes).
👉 Usage : Idéal pour transformer un Flow en appel unique (ex: une requête réseau one-shot encapsulée dans un Flow).
// Récupère la valeur et passe à la suite immédiatement
val isSuccess = myFlow.first()
if (isSuccess) { /* ... */ }🧩 Résumé
- 🔄
collect(): Pour les flux continus. Exécute une action à chaque émission. - 🎯
first(): Pour les opérations ponctuelles. Prend la première valeur et s'arrête. - 💡 Si votre Flow représente une opération unique (comme
deassociateComp),first()rend le code plus linéaire et lisible.