Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpFwNs 194 of 299 menu
◀ ▶

Вложенный поток в 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 постройте внутренние потоки, повторяющие число столько раз, сколько оно равно. Выведите все элементы одной последовательностью.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить