Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 646новых вакансий за сутки·91 617вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 156
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 402 кандидата открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python17 103
  • Облачные технологии14 031
  • QA вакансии3 458
  • Backend вакансии2 078
  • Инженер данных1 772
  • Продакт-менеджер1 238

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии973
  • AI вакансии948
  • Frontend вакансии736
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 542
  • Node.js2 017
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP682
  • C++570

DevOps и инфраструктура

  • Kubernetes7 748
  • DevOps вакансии6 051
  • Linux-инфраструктура5 485
  • Terraform / IaC4 252
  • CI/CD3 239
  • Мониторинг и Observability1 781
  • SRE560
  • Кибербезопасность446

Аналитика и данные

  • Data Scientist1 114
  • Бизнес-аналитик915
  • Аналитик данных828
  • Системный аналитик154

Другие направления

  • Проджект-менеджер606
  • UI/UX дизайн143
  • Ручное тестирование14

По регионам

  • Вакансии в США43 172
  • Вакансии в Европе23 542
  • Вакансии в Канаде4 358
  • Работа в России3 909

По формату

  • Удалённые вакансии72 938
  • Релокация в США43 172
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии41 839
  • Middle вакансии20 268
  • Junior вакансии6 588

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Kotlin CoroutinesВсе вопросы
Kotlin CoroutinesJuniorТеория

Что такое Flow в Kotlin и чем он отличается от suspend fun, возвращающей одно значение?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

suspend fun возвращает ровно одно значение после завершения; Flow — асинхронный холодный поток, испускающий 0..N значений, который не стартует до вызова collect. Используйте suspend fun для разовых запросов, Flow — для потоков событий или реактивных обновлений.

suspend fun — одиночный результат

// Возвращает одно значение после завершения IO-операции
suspend fun fetchUser(id: Long): User {
    return httpClient.get("https://api.example.com/users/$id")
}

// Вызов:
val user = fetchUser(42)  // suspend fun, ждём одного User
println(user.name)

Функция стартует, делает работу и возвращает ровно одно значение (или бросает исключение). После возврата она «мертва».

Flow vs suspend fun: одно значение или поток

Suspend-функция, возвращающая одно значение, выполняется один раз и отдаёт результат — как обычный блокирующий вызов, но без блокировки потока. Flow — это асинхронный поток, который может испустить ноль, одно или много значений во времени, а затем завершиться нормально или с ошибкой.

Flow — поток значений

import kotlinx.coroutines.flow.*
import kotlinx.coroutines.*

// Испускает новые цены акции каждые 500 мс
fun stockPrices(ticker: String): Flow<Double> = flow {
    while (true) {
        val price = fetchLatestPrice(ticker)  // suspend
        emit(price)
        delay(500)
    }
}

// Сборщик:
fun main() = runBlocking {
    stockPrices("AAPL")
        .take(5)
        .collect { price -> println("Price: $price") }
}

Ключевые отличия

  • Количество значений: suspend fun — ровно одно (или исключение); Flow — 0..N значений.
  • Холодность: Flow холодный — код внутри flow { } не выполняется до вызова терминального оператора (collect, first, toList). Каждый новый сборщик запускает Flow заново.
  • Время жизни: suspend fun живёт от вызова до возврата; Flow может существовать неограниченно долго (WebSocket, наблюдение за БД).
  • Отмена: оба поддерживают отмену через CancellationException; у Flow отмена распространяется на производителя через отмену вызывающего scope.
  • Обработка ошибок: у suspend fun — стандартный try/catch; у Flow — операторы catch { } и onCompletion { }, плюс try/catch в collect.

Когда что выбирать

  • Нужен один HTTP-ответ, результат SQL-запроса, итог вычисления → suspend fun.
  • Нужны обновления в реальном времени, наблюдение за Room-базой, серия событий, пагинация → Flow.
  • StateFlow/SharedFlow используются для разделяемого «горячего» состояния (замена LiveData в Android).

Пример: Room возвращает Flow

// DAO
@Dao
interface UserDao {
    // suspend fun — разовый запрос
    @Query("SELECT * FROM users WHERE id = :id")
    suspend fun getById(id: Long): User?

    // Flow — реактивное наблюдение, переиспускается при изменении таблицы
    @Query("SELECT * FROM users ORDER BY name")
    fun observeAll(): Flow<List<User>>
}

Подводные камни

  • Холодность забывается: если никто не вызывает collect, код внутри flow { } никогда не выполнится — это ошибка, если вы ожидаете side-эффект (логирование, запись в БД) при создании Flow.
  • Несколько сборщиков = несколько запусков: два вызова collect на одном холодном Flow запускают два отдельных «сеанса» — это удваивает сетевые вызовы. Используйте shareIn или stateIn для «горячего» разделения.
  • emit не thread-safe: нельзя вызывать emit из разных корутин одновременно без channelFlow { }.
  • CancellationException нельзя проглатывать: внутри flow { } catch-блок, поглощающий все исключения, сломает отмену корутины.
  • Бесконечный Flow утечёт: без take(n), takeWhile или отмены scope бесконечный Flow (WebSocket, polling) продолжит работу вечно.
  • suspend fun нельзя вернуть из Flow-билдера напрямую: попытка возвращать suspend fun там, где ожидается Flow, приведёт к ошибке типов.

Типичные ошибки

  • Объяснять «Flow и suspend fun с одним значением» только как синтаксис и не описывать поведение runtime/compiler.
  • Игнорировать важный риск: Использование Flow для одного значения усложняет API, а suspend fun не подходит для stream progress/events.
  • Давать пример без edge case: отмены, null, recomposition, platform boundary или ошибки.

Что проверяет интервьюер

  • Формулирует суть темы «Flow и suspend fun с одним значением» своими словами и связывает ее с кодом.
  • Называет механизм: Cold Flow начинает работу при collect и может применять operators между emission и collector.
  • Видит production-последствие: Использование Flow для одного значения усложняет API, а suspend fun не подходит для stream progress/events.

Как вы знаете этот вопрос?

Проверить себя по теме Kotlin Coroutines →

Источники

  • https://kotlinlang.org/docs/flow.html
←Предыдущий вопросЧто такое suspend-функция и где её можно вызывать?Следующий вопрос→Что такое `CoroutineDispatchers` и в чём разница между `Main`, `IO`, `Default` и `Unconfined`?

Связанные темы

Kotlin Coroutinesconcurrencyflow-vs-suspend-single-reasoningkotlin coroutines

Частые вопросы на собеседовании

  • Что такое structured concurrency и почему это важно?
  • В чём разница между билдерами coroutine launch и async?
  • Что такое suspend-функция и где её можно вызывать?
  • Что такое CoroutineDispatchers и в чём разница между Main, IO, Default и Unconfined?