В чем разница между холодным и горячим Flow в Coroutines

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

Ответ

Холодный Flow — это поток данных, который начинает испускать значения только при вызове терминального оператора (collect). Каждый новый подписчик получает независимую последовательность данных. Пример:

val coldFlow = flow {
    println("Emitting")
    emit(1)
    emit(2)
}
// Вызовется дважды для каждого collect
coldFlow.collect { println(it) } 
coldFlow.collect { println(it) }

Горячий Flow (например, SharedFlow/StateFlow) — активен независимо от наличия подписчиков и эмитит данные всем текущим подписчикам. Данные могут быть потеряны, если нет активных коллекторов. Пример:

val sharedFlow = MutableSharedFlow<Int>()
// Данные будут получены только активными подписчиками
sharedFlow.emit(1) 

Ключевые различия:

  1. Холодный — ленивый, горячий — активный
  2. Холодный — независимые последовательности, горячий — общий источник
  3. Холодный — данные не теряются, горячий — возможна потеря данных