Создание потока в Kotlin
Новый поток собирают вызовом flow с
лямбдой-строителем. Внутри доступен приемник
FlowCollector: через него же работает
emit, отправляя очередное значение
сборщику.
Один блок может отдать сколько угодно элементов -
каждый emit приостанавливает строитель,
пока текущее значение не обработано:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val sizes = flow {
emit("S")
emit("M")
emit("L")
}
sizes.collect { tag ->
println(tag)
}
}
}
Три метки печатаются подряд без пропусков: поток
живет в одной корутине сборщика и не смешивает
порядок emit.
Между отправками допустимы обычные вычисления и ветвления - в поток уходят уже готовые результаты:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val scores = flow {
for (n in 1..3) {
val points = n * 10
emit(points)
}
}
scores.collect { value ->
println(value)
}
}
}
Числа 10, 20 и 30
отражают цикл внутри строителя. Так один
flow описывает и правило, и всю
последовательность на выходе.
Опишите поток из трех строк "red",
"green" и "blue" через
отдельные emit. Соберите его в
runBlocking и выведите каждую строку
с новой строки.
Внутри flow пройдите по числам от
1 до 4 и отправьте в поток
квадрат индекса. Соберите результат и
напечатайте все четыре числа.