Определение, на каком диспетчере работают операции Flow

map выполняется на Dispatchers.IO, filter — на Dispatchers.Default, а terminal-оператор single собирает результат в Dispatchers.Main. flowOn меняет контекст только расположенного выше участка.

Короткий ответ

Что ответить на собеседовании

map выполняется на Dispatchers.IO, filter — на Dispatchers.Default, а terminal-оператор single собирает результат в Dispatchers.Main. flowOn меняет контекст только расположенного выше участка.

Подробный разбор

Ответ с пояснениями

Условие

В примере используется поток intFlow, к которому последовательно применяются операции map, filter и single. Между этими операциями вызываются flowOn с разными диспетчерами (Dispatchers.IO и Dispatchers.Default). Нужно указать, в каком диспатчере будет выполнена каждая из операций map, filter и single.

withContext(Dispatchers.Main) {
    val singleValue = intFlow
        .map { /* где будет выполнен код? */ }
        .flowOn(Dispatchers.IO)
        .filter { /* где будет выполнен код? */ }
        .flowOn(Dispatchers.Default)
        .single() // а здесь?
}

Ответ

map выполняется на Dispatchers.IO, filter — на Dispatchers.Default, а terminal-оператор single собирает результат в Dispatchers.Main. flowOn меняет контекст только расположенного выше участка.

Первый flowOn(IO) переносит источник и map. Следующий flowOn(Default) задаёт контекст для filter, не отменяя уже заданную границу IO. single возвращает значение только при ровно одном элементе: пустой поток или несколько результатов завершатся исключением. Сам фрагмент с пустыми лямбдами — схема вопроса; filter должен реально возвращать Boolean.

Источник: kotlinlang.org.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее