Что использовать, если нужно три разных запроса мапить между собой

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

Ответ

Для маппинга нескольких запросов можно использовать zip или combine из RxJava/Kotlin Flow.

Пример с zip (RxJava):

Observable.zip(
    api.getUser(),
    api.getPosts(),
    api.getComments(),
    { user, posts, comments -> Triple(user, posts, comments) }
).subscribe { (user, posts, comments) -> 
    // обработка данных 
}

Пример с combine (Kotlin Flow):

combine(
    flow1, flow2, flow3
) { data1, data2, data3 -> 
    Triple(data1, data2, data3) 
}.collect { (d1, d2, d3) -> 
    // обработка 
}

Важно:

  • zip ждёт завершения всех запросов.
  • combine эмитит при каждом обновлении любого из потоков.
  • Для отмены при ошибке используй flatMap + onError.