← Back to Kotlin Course | Chapter 12: Coroutines | Lesson 5 of 7

Flow के Basics

एक Flow एक conveyor belt जैसा है जो समय के साथ आपको एक-एक करके values की एक पूरी stream पहुंचाता है, एक साथ सब कुछ देने के बजाय।
Syntax
kotlin
val flow = flow {
    emit(value)          // produce values one by one
}

flow.map { it transformation }
    .filter { condition }
    .collect { value -> /* runs the flow */ }

Creating a Flow

flow { } एक cold stream बनाता है जो emit() का उपयोग करके एक-एक करके values emit करता है; जब तक flow collect नहीं होता तब तक अंदर कुछ नहीं चलता।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Creating a Flow

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun numberFlow(): Flow<Int> = flow {
    for (i in 1..3) {
        delay(20)
        emit(i)
    }
}

fun main() = runBlocking {
    numberFlow().collect { value ->
        println("Collected: $value")
    }
}

Flows Are Cold

कोई Flow values produce करना तब तक शुरू नहीं करता जब तक इस पर असल में .collect { } (या कोई दूसरा terminal operator) call न हो, यानी एक ही flow को कई बार collect किया जा सकता है, हर बार इसके logic को ताज़ा चलाते हुए।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Flows Are Cold

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun greetingFlow(): Flow<String> = flow {
    println("Flow started")
    emit("Hello")
}

fun main() = runBlocking {
    println("Before collecting")
    val flow = greetingFlow()
    println("Flow created, but not started yet")
    flow.collect { println(it) }
}

Transforming a Flow

.map { } और .filter { } जैसे operators किसी Flow पर लगभग वैसे ही काम करते हैं जैसे किसी collection पर, एक pipeline बनाते हुए जो flow आखिरकार collect होने पर चलती है।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Transforming a Flow

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    (1..5).asFlow()
        .filter { it % 2 == 0 }
        .map { it * 10 }
        .collect { println("Value: $it") }
}

Flow vs a Single Suspend Result

जबकि एक साधारण suspend fun बिल्कुल एक value return करता है, एक Flow समय के साथ आने वाले शून्य, एक, या कई values represent करने के लिए बना है, इसे चल रहे data की streams के लिए बेहतर fit बनाते हुए।

Warning:
  • यह उदाहरण kotlinx.coroutines उपयोग करता है, जो साधारण Kotlin standard library का हिस्सा नहीं है।
  • इसे compile और run करने के लिए kotlinx-coroutines-core dependency (Gradle/Maven के ज़रिए जोड़ी गई) चाहिए।

उदाहरण: Flow vs a Single Suspend Result

markup
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun main() = runBlocking {
    val total = (1..5).asFlow().fold(0) { acc, value -> acc + value }
    println("Total from flow: $total")
}
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. यह भूल जाना कि कोई Flow cold है -- इसका code तब तक बिल्कुल नहीं चलता जब तक असल में कोई इसे .collect { } से collect न करे।
  2. किसी Flow के collector के अंदर suspend-friendly operations के बजाय block करना, जो Flow उपयोग करने का मकसद हरा सकता है।
  3. Flow (संभावित रूप से समय के साथ कई asynchronous values के लिए बना) को एक single value return करने वाले suspend fun, या Sequence (synchronous, suspend-aware नहीं) के साथ confuse करना।
चैप्टर सारांश
  • flow { } values की एक cold asynchronous stream बनाता है, जो emit() से एक-एक करके emit होती है।
  • कोई Flow तब तक कुछ नहीं करता जब तक इस पर .collect { } call न हो -- यह lazily execute होता है, Sequence जैसी भावना में।
  • .map { } और .filter { } जैसे Flow operators stream को transform करते हैं, collection operations के समान लेकिन suspend-aware।
  • Flows kotlinx.coroutines द्वारा प्रदान की जाती हैं और आमतौर पर समय के साथ आने वाले data की streams के लिए उपयोग होती हैं।
🔒

Chapter Quiz — Complete all 7 topics to unlock

0/7 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.