RxJava 2 - Observable.flatMapSingle 说明

RxJava 2 - Observable.flatMapSingle clarification

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

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

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

因此,从某种意义上说,flatMapSingle() 的工作方式与 flatMap() 类似,它使用合并运算符并且不保证元素的顺序将被保留。

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

flatMap 不能保证评论中提到的@akarnokd 的顺序。

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

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

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