RxJava 2 - Observable.flatMapSingle 说明
RxJava 2 - Observable.flatMapSingle clarification
我做了一个 RxJava2 实验,包括以下步骤:
- 从对象的 ListA 创建一个 Observable。
- 使用 flatMapSingle() 将 Observable 发出的每个项目映射到 SingleSource。在 flatMapSingle() 内部,对 Observable 发出的每个项目执行异步操作。
- 收集了 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
)。
我做了一个 RxJava2 实验,包括以下步骤:
- 从对象的 ListA 创建一个 Observable。
- 使用 flatMapSingle() 将 Observable 发出的每个项目映射到 SingleSource。在 flatMapSingle() 内部,对 Observable 发出的每个项目执行异步操作。
- 收集了 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
)。