Вложенный поток в Kotlin
Иногда каждому элементу соответствует свой
внутренний Flow. Тогда наружу нужна
одна лента значений. Функция flatMapConcat
для каждого входа запускает внутренний поток
и полностью собирает его, прежде чем перейти к
следующему внешнему элементу.
Метка группы разворачивается в серию букв без перемешивания групп:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val groups = flowOf("ab", "c")
groups.flatMapConcat { chunk ->
flow {
chunk.forEach { ch ->
emit(ch)
}
}
}.collect { ch ->
println(ch)
}
}
}
Порядок 'a', 'b', 'c':
внутренний поток для "ab" завершился,
лишь затем начался поток для "c".
Число снаружи может порождать короткую последовательность внутри:
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flatMapConcat
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
flowOf(1, 2)
.flatMapConcat { n ->
flow {
repeat(n) { emit(n) }
}
}
.collect { value ->
println(value)
}
}
}
Вывод 1, затем 2 и 2.
Функция flatMapConcat не параллелит внутренние
потоки - они идут строго друг за другом.
Внешний поток из строк "x" и "y"
превратите в одну ленту символов: каждая
строка дает один одноименный символ.
Соберите результат - должны получиться
'x' и 'y' по порядку.
Для чисел 1 и 3 постройте
внутренние потоки, повторяющие число столько
раз, сколько оно равно. Выведите все
элементы одной последовательностью.