【问题标题】:RxJava 2 - Observable.flatMapSingle clarificationRxJava 2 - Observable.flatMapSingle 说明
【发布时间】:2017-11-08 09:51:54
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 按照惯例,flatMap 不保证输出事件相对于映射到源中的输入值的顺序。
  • 感谢您的即时回复。文档对flatMap 非常清楚,正如您所说。我只是想确认这同样适用于flatMapSingle(是的,名称中包含 flatMap,但比抱歉更安全......)

标签: rx-java rx-java2


【解决方案1】:

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),这可能有助于改进并行化任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-15
    • 2017-11-24
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多