В каких диспатчерах будет запущен Flow: map, filter, single

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

Ответ

Flow выполняется в том же диспатчере, в котором был вызван терминальный оператор (например, collect). Промежуточные операторы (map, filter, single) не влияют на контекст выполнения.

Пример:

flow {
    emit(1)
    emit(2)
}
.map { it * 2 } // выполнится в том же контексте, что и collect
.filter { it > 2 } // аналогично
.single() // тоже
.collect { value ->
    println(value) // зависит от диспатчера collect-а
}

Если нужно изменить контекст, используйте flowOn:

flow { ... }
    .flowOn(Dispatchers.IO) // меняет контекст для upstream
    .collect { ... } // выполняется в контексте collect-а