Сбор потока в Kotlin
Функция collect - точка, где описание потока
превращается в работу. Пока лямбда сборщика
ожидает элемент, строитель flow может
выполнять код и вызывать emit; когда
элементов больше нет, корутина сборщика
завершается.
Первый запуск можно отметить строкой в начале
строителя - она появится только после старта
collect:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val probe = flow {
println("run")
emit(1)
}
probe.collect { }
}
}
Метка "run" печатается один раз на один
сбор. До вызова collect внутренний код
потока не трогается.
Повторный collect у того же объекта
Flow снова входит в блок flow
с нуля. Такой поток называют холодным: он
оживает под каждого сборщика отдельно:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val probe = flow {
println("run")
emit(1)
}
probe.collect { }
probe.collect { }
}
}
"run" дважды означает два независимых
прохода, а не продолжение прежнего. Общего
состояния между сборами у холодного потока нет.
Сделайте поток, который в начале печатает
"go" и отдает число 7.
Дважды соберите его в одном runBlocking
и убедитесь, что метка повторяется.
Поток отдает две строки "a" и "b".
При первом сборе выведите каждую букву, при
втором - только длину строки. Оба сбора
должны получить полную пару значений.