RxJava 2 - Observable.flatMapSingle澄清

时间:2017-11-08 09:51:55

标签: rx-java rx-java2

我做了一个 RxJava2 实验,包括以下步骤:

  1. ListA 对象创建一个Observable。
  2. 使用flatMapSingle()将Observable发出的每个项目映射到SingleSource。在flatMapSingle()中,对Observable发出的每个项目执行异步操作
  3. 使用Observable.toList()
  4. 收集 ListB 中的所有项目

    结果:由于异步操作, ListB 的项目顺序与 ListA 的顺序不同。

    因此,似乎flatMapSingle()的工作方式与flatMap()类似,它使用合并运算符并不保证元素的顺序将被保留。

    我的结论是否正确?文档没有涵盖我,并且不存在关于此行为的讨论。

1 个答案:

答案 0 :(得分:6)

flatMap并不保证在评论中提及@akarnokd。

如果您想保证订购,可以使用concatMap,但它只允许您与内部Observable连接。似乎RxJava1和RxJava2中都没有concatMapSingle的版本。但是,您可以通过自己使用Single将内部Observable转换为toObservable()来解决此问题,并将其与concatMap这样使用(用Kotlin编写的代码)。

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

请注意,还有concatMapEager会热切地订阅内部Observable(或上例中的Single),这可能有助于改进并行化任务。