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

Сбор потока в 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". При первом сборе выведите каждую букву, при втором - только длину строки. Оба сбора должны получить полную пару значений.

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