Зачем нужно преобразование холодного потока данных в горячий и наоборот

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

Ответ

Холодные потоки (например, Flow в Kotlin) создают данные при каждом вызове collect(), что полезно для одноразовых операций. Горячие потоки (например, StateFlow, SharedFlow) эмитят данные независимо от подписчиков, что удобно для постоянных обновлений UI.

Когда преобразовывать:

  • Холодный → Горячий: когда данные нужны нескольким подписчикам (кеширование, общее состояние)
val coldFlow = flow { emit(data) }
val hotFlow = coldFlow.shareIn(scope, SharingStarted.Eagerly)
  • Горячий → Холодный: когда нужна одноразовая обработка (например, для retry)
val coldFlow = hotFlow.asSharedFlow().take(1)

Нюанс: горячие потоки могут терять данные, если подписчик не успел их обработать.