map выполняется на Dispatchers.IO, filter — на Dispatchers.Default, а terminal-оператор single собирает результат в Dispatchers.Main. flowOn меняет контекст только расположенного выше участка.
Определение, на каком диспетчере работают операции Flow
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.