collect
- Kotlin kursu
- Orta seviye
- Ders 90/116
- 5 dk
collect ile Flow tüketmeyi öğrenirsin.
collect: Terminal operatör
collect bir terminal operatördür: akışı başlatır ve değerleri tüketir. Ara operatörlerin (map, filter) aksine, collect çağrılmazsa akış hiç çalışmaz. Bu yüzden Flow'a "soğuk" denir.
fun numbers(): Flow<Int> = flowOf(1, 2, 3)
fun main() = runBlocking {
numbers().collect { println(it)
}
}collect bir suspend fonksiyondur; yalnızca coroutine içinde çağrılır. Lambda, her emit değeri için sırayla çalışır. Akış bittiğinde collect döner ve main devam eder.
collect bir coroutine içinde
collect bir suspend fonksiyon olduğu için yalnızca bir coroutine içinden çağrılabilir. main'de runBlocking { ... } kullanmak, akışı senkron çağrıyla köprüler. Böylece program, akış bitene kadar bekler.
fun main() = runBlocking {
var sum = 0
numbers().collect { sum += it }
println(sum)
}Burada collect her değerde sum += it yapar; akış bitince println(sum) çalışır. Lambda içinden dış değişkeni değiştirmek (burada sum) küçük akışlarda güvenlidir. Daha karmaşık durumlarda fold gibi operatörler tercih edilir.
Uygulama collect ile değerleri topla
fun numbers(): Flow<Int> = flowOf(1, 2, 3) tanımla. main'i runBlocking ile işaretle. İçinde var sum = 0 başlat; numbers().collect { sum += it } ile değerleri topla; println(sum) ile sonucu yazdır.
Başlangıç kodu
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.runBlocking
// numbers fonksiyonu: 1, 2, 3 değerleriyle Flow<Int> döndürsün
// main: runBlocking içinde topla ve sum değişkenine biriktir
// sum'ı println ile yazdır
fun main() = runBlocking {
// buraya yaz
}Örnek çözüm
fun numbers(): Flow<Int> = flowOf(1, 2, 3)
fun main() = runBlocking {
var sum = 0
numbers().collect { sum += it }
println(sum)
}Beklenen çıktı
6
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 flow.collect { ... } ne yapar?
- Akışı tüketir; her değer için lambda çalıştırır Doğru cevap
- Akışı listeye çevirir
- Akışı başlatır ama değer almaz
- Akışı iptal eder
Açıklama: collect terminal'dir; her emit değeri için lambda'yı çalıştırır.
2 collect kavramlarını eşle
| Kavram | Anlamı |
|---|---|
collect { } |
Tüketici |
terminal |
Son işlem |
suspend |
Beklemeli |
println(it) |
Değeri yazdırır |
3 Akışı tüket
fun main() = runBlocking {
numbers().____ { println(it) }
}
fun main() = runBlocking {
numbers().collect { println(it) }
}
Açıklama: collect, akışı tüketen terminal operatördür.