Что делает оператор collect? Можно ли вызвать его из обычной функции?

Оператор collect в FlowStateFlow, SharedFlow) — это терминальный оператор, без которого Flow не начнёт выполняться.

Что делает collect

flowOf(1, 2, 3).collect { value ->
    println(value)
}
  • collect {} — это подписка на Flow
  • он запускает producer, и ты получаешь все значения по мере их эмиссии
  • без collectflow {} даже не начнёт работу (он холодный!)
  • Аналог в Rx: subscribe {}
  • Аналог в Java Streams: .forEach {}

collect — suspend-функция

Это значит: ты не можешь вызвать collect() из обычной функции без suspend или coroutineScope. Почему collect — suspend? Потому что:

  • Это позволяет строить асинхронные цепочки, которые приостанавливаются и возобновляются безопасно
  • Flow может содержать delay, withContext, emit, и т.д.
  • collect может приостанавливаться, чтобы не блокировать поток

Следовательно нужно вызывать функцию collect() из другой suspend-функции или scope.


Опубликовано

в

,

от

Метки: