Определение результата вывода при работе с Observable в RxJava

Результат не гарантирован: flatMapSingle может собрать заказы в порядке завершения запросов, а не исходных ID. Сравнение способно вернуть true или false; обычный main может завершиться до вывода.

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

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

Результат не гарантирован: 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.

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

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

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

Подробнее