Результат не гарантирован: flatMapSingle может собрать заказы в порядке завершения запросов, а не исходных ID. Сравнение способно вернуть true или false; обычный main может завершиться до вывода.
Определение результата вывода при работе с Observable в RxJava
Результат не гарантирован: flatMapSingle может собрать заказы в порядке завершения запросов, а не исходных ID. Сравнение способно вернуть true или false; обычный main может завершиться до вывода.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой результат будет напечатан функцией print?
fun main() {
val orderIds: List<Long> = listOf(1, 2, 3)
loadAllOrders(orderIds)
.subscribe({ orders ->
val result = orderIds == orders.map(Order::id)
print(result)
})
}
private fun loadAllOrders(orderIds: List<Long>): Single<List<Order>> {
return Observable.fromIterable(orderIds)
.subscribeOn(Schedulers.io())
.flatMapSingle(::loadOrderById)
.toList()
}
Ответ
Результат не гарантирован: flatMapSingle может собрать заказы в порядке завершения запросов, а не исходных ID. Сравнение способно вернуть true или false; обычный main может завершиться до вывода.
Если loadOrderById асинхронен, быстрый запрос третьего заказа может обогнать первый. Для сохранения порядка подходят concatMapSingle либо сортировка результатов по исходной последовательности ID с учётом дублей. subscribeOn(io) переносит подписку, но не добавляет ожидание завершения main. Ошибка любого запроса без обработки также не даст ожидаемого списка.
Источник: reactivex.io.