Выполнится ли код после вызова join у Job которая создана с помощью collect у Flow в Coroutines

«Выполнится ли код после вызова join у Job которая создана с помощью collect у Flow в Coroutines» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Код после join() у Job из collect выполнится только после завершения Flow.

Пример:

val job = launch {
    flowOf(1, 2, 3).collect { 
        delay(1000)
        println(it) 
    }
}
job.join()
println("Done") // Выполнится после завершения Flow

Нюансы:

  1. Если Flow бесконечный (например, flow { while(true) emit(1) }), код после join не выполнится
  2. При отмене родительской корутины или самой Job, join выбросит CancellationException
  3. Для холодных Flow коллекция начнется только при вызове collect