RxJava 2 - Observable.flatMapSingle пояснение

Я провел эксперимент RxJava2, состоящий из следующих шагов:

  1. Создайте Observable из ListA объектов.
  2. Используйте flatMapSingle (). для сопоставления каждого элемента, испускаемого Observable, с SingleSource. Внутри flatMapSingle () асинхронная операция выполняется для каждого элемента, испускаемого Observable.
  3. Собраны все элементы в ListB с помощью Observable.toList ()

Результат: элементы ListB расположены в другом порядке, чем ListA, из-за асинхронной операции.

Итак, похоже, что flatMapSingle () работает как flatMap () в том смысле, что он использует оператор слияния и не гарантирует, что порядок элементов будет сохранен.

Мой вывод верен? Документация не касалась меня, и обсуждения этого поведения не ведутся.


person Ευάγγελος Μπίλης    schedule 08.11.2017    source источник
comment
По соглашению flatMap не гарантирует упорядочение выходных событий по отношению к входному значению, которое было отображено в источники.   -  person akarnokd    schedule 08.11.2017
comment
Спасибо за немедленный ответ. Документы довольно четко определяют flatMap, и это так, как вы сказали. Я просто хотел подтвердить, что то же самое относится и к flatMapSingle (да, в имени есть flatMap, но лучше перестраховаться, чем сожалеть ...)   -  person Ευάγγελος Μπίλης    schedule 08.11.2017


Ответы (1)


flatMap не гарантирует заказ, как @akarnokd, упомянутый в комментарии.

Если вы хотите гарантировать упорядочение, вы можете использовать concatMap, но он позволяет объединять только с внутренним Observable. Похоже, версии concatMapSingle нет ни в RxJava1, ни в RxJava2. Однако вы можете обойти это, преобразовав внутреннее Single в Observable с помощью toObservable() самостоятельно и используя его с concatMap, как это (код написан на Kotlin).

Observable
    .fromIterable(listA)
    .concatMap { single.toObservable() }
    .toList() // Items in the list has same order of listA

Обратите внимание, что есть также concatMapEager, который будет охотно подписываться на внутренний Observable (или Single в приведенном выше примере), что может помочь улучшить распараллеливание задач.

person onelaview    schedule 15.02.2018