Что это простыми словами
Flow — это конвейер для данных, которые приходят порциями во времени.
Аналогия: представьте ленту новостей в соцсети. Новые посты появляются постепенно — один за другим. Flow — это способ обрабатывать такой поток: как только пришёл новый пост, приложение его получает, обрабатывает и показывает пользователю. Или как курьерская служба: вы подписались на получение посылок, и как только посылка готова, курьер её приносит — не нужно постоянно бегать и проверять.
Данные могут приходить из разных источников: с сервера по сети, из базы данных, от датчиков телефона. Flow позволяет удобно подписаться на эти данные и реагировать на каждое новое значение.
Официальное определение
Теперь, когда суть понятна, вот как Flow описывают в вакансиях и документации. Эту формулировку вы встретите у заказчика и в резюме — и теперь будете понимать, что за ней стоит.
«Flow — холодный асинхронный поток данных в Kotlin, построенный поверх корутин и испускающий последовательность значений».
Разберём по словам. «Асинхронный» значит, что данные приходят не сразу, а со временем — приложение не зависает в ожидании. «Холодный поток» означает, что данные начинают поступать только когда кто-то подписался и реально слушает — как видео на YouTube не грузится, пока вы его не запустили. «Корутины» — это способ писать асинхронный код в Kotlin просто и понятно, без колбэков и вложенности; Flow работает на их основе. «Испускающий последовательность значений» — это и есть тот самый конвейер: не одно значение сразу, а поток данных один за другим.
Какую задачу решает
Flow решает задачу обработки данных, которые приходят не разом, а порциями: обновления с сервера, изменения в базе данных, события от пользователя. Вместо того чтобы постоянно опрашивать источник «есть ли что-то новое?», приложение подписывается один раз — и получает уведомления о каждом изменении.
Типичные примеры: лента сообщений в чате обновляется в реальном времени, список товаров в корзине меняется при каждом добавлении, поиск показывает результаты по мере того, как пользователь печатает. Во всех этих случаях данные поступают постепенно, и Flow позволяет элегантно с этим работать.
Побочная польза: Flow даёт удобные инструменты для преобразования данных по пути — фильтровать, объединять несколько потоков, откладывать обработку. Это упрощает код и делает его читаемым.
К какой экосистеме относится
Язык — Kotlin.
Специальность — чаще всего Android-разработчик, но также backend-разработчик на Kotlin.
Связь с другими технологиями — Flow является частью библиотеки Kotlin Coroutines. Корутины и Flow работают вместе: корутины запускают асинхронные операции, Flow управляет потоками данных внутри них. Часто встречается рядом с Retrofit (для сетевых запросов) и Room (база данных) — обе умеют отдавать данные через Flow.
Чем заменяется
До появления Flow в мире Kotlin/Android эту задачу решала библиотека RxJava (и её Android-версия RxAndroid). Обе делают одно и то же — работают с асинхронными потоками данных. Но переход между ними дорогой: это разные API, разные способы мышления, и переучивание занимает недели. Проект на RxJava редко переписывают на Flow целиком — слишком затратно.
Ещё один вариант — LiveData (часть Android Jetpack). Она проще Flow, но менее гибкая. Сейчас во многих проектах LiveData заменяют на Flow, потому что Flow мощнее и универсальнее. Переход с LiveData на Flow проще, чем с RxJava.
Также в Kotlin есть Channels — другой способ передачи данных внутри корутин. Разница в том, что Channel «горячий» (данные идут, даже если никто не слушает), а Flow «холодный» (запускается только при подписке). Обычно Flow удобнее, но в некоторых случаях нужны именно каналы.
Что не путать
Flow ≠ корутины. Корутины — это способ писать асинхронный код в Kotlin, а Flow — инструмент для работы с потоками данных внутри корутин. Они работают вместе, но это не одно и то же. Можно использовать корутины без Flow.
Flow ≠ Redux или MobX. Те решают другую задачу — хранение общего состояния приложения. Flow занимается потоками данных, которые постепенно приходят из внешних источников. Это разные уровни.
Flow ≠ Retrofit. Retrofit — библиотека для сетевых запросов, Flow — для обработки потоков данных. Но они часто работают вместе: Retrofit может возвращать данные в виде Flow.
Flow ≠ StateFlow и SharedFlow как разные технологии. StateFlow и SharedFlow — это специальные виды Flow с дополнительными возможностями, не отдельные библиотеки. Если кандидат упоминает их, это всё тот же Flow.
Насколько это важно при отборе
Короткий ответ: зависит от проекта.
Если проект уже на Flow — хорошо, когда кандидат знаком с ним. Но если у кандидата опыт с RxJava вместо Flow, это не повод отбраковывать сразу. Да, переход требует времени (несколько недель), но человек с опытом работы с реактивными потоками разберётся. Главное — что он понимает саму идею асинхронных потоков данных.
Обратная ситуация сложнее: если проект на RxJava, а кандидат знает только Flow — переучиться тоже можно, но RxJava считается более сложной и запутанной. Стоит уточнить у нанимающего менеджера, готовы ли они дать время на адаптацию.
Если кандидат вообще не работал с асинхронными потоками (ни Flow, ни RxJava, ни LiveData), а вакансия предполагает сложную работу с данными в реальном времени — это красный флаг. Спросите, как он решал подобные задачи: возможно, использовал колбэки или другие подходы, но тогда придётся учить Flow с нуля.
Это общий ориентир. В разных компаниях требования отличаются, поэтому всегда сверяйтесь с текстом конкретной вакансии.