В чем разница между каналами и Flow

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

Ответ

Каналы (Channel) и Flow — это разные инструменты Kotlin Coroutines для работы с асинхронными потоками данных.

Каналы (Channel):

  • Горячие потоки: данные начинают передаваться сразу, даже если нет подписчика.
  • Поддерживают несколько подписчиков, но каждый элемент потребляется только одним.
  • Используются для коммуникации между корутинами (например, send/receive).
val channel = Channel<Int>()
launch { channel.send(1) }
launch { println(channel.receive()) } // 1

Flow:

  • Холодные потоки: данные начинают передаваться только при вызове collect.
  • Поддерживают трансформации (map, filter) и могут быть перезапущены.
  • Не хранят состояние, каждый collect запускает поток заново.
flow { emit(1) }.collect { println(it) } // 1

Итог: Channel — для обмена данными между корутинами, Flow — для реактивных потоков с трансформациями.