Введение в потоки в Kotlin
Корутина может описать не одно действие, а цепочку
шагов с данными между ними. Поток в
kotlinx.coroutines.flow - способ выдавать
такие значения по очереди: каждое следующее
появляется только когда сборщик готов его принять.
Поток не крутит цикл сам по себе на фоне. Код
внутри блока flow выполняется, когда к
нему подключают сбор; до этого описание лежит
без движения, как рецепт без повара.
Значение в поток кладут вызовом emit.
Снаружи цепочку читают через collect в
runBlocking - для каждого элемента
выполняется переданное действие:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val stream = flow {
emit("alpha")
emit("beta")
}
stream.collect { part ->
println(part)
}
}
}
В консоли появляются "alpha" и "beta"
именно в этом порядке: emit задает
очередность, а collect пробуждает поток и
забирает элементы по одному. Пока сбор не начат,
тело flow не выполняется.