rx-java - RxJava 2-Observable.flatMapSingle澄清

标签 rx-java rx-java2

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

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

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

    因此,似乎flatMapSingle()就像flatMap()一样工作,因为它使用合并运算符,并且不能保证将保留元素的顺序。

    我的结论正确吗?文档没有涵盖我,也没有关于此行为的讨论。

    最佳答案

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

    关于rx-java - RxJava 2-Observable.flatMapSingle澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47176437/

    相关文章:

    android - 如何在 Android 上对 RxJava Completable.error 进行单元测试

    java - 如何使用 RxJava 和 RxAndroid 获取带条件的 map ?

    没有实例的 Java 枚举

    java - 获取 Observable 的最新值并立即发出

    java - ConnectableObservable 何时终止?

    unit-testing - 测试 RxJava .delay(20, SECONDS)

    android - 我需要在调用 dispose() 之前检查 isDisposed() 吗?

    java - RxJava 2 发生错误后如何继续处理?

    playframework - 在 rxjava Observables 中传播 slf4j MDC(映射诊断上下文)

    java - RxJava的clear(CompositeDisposable)方法内部是如何工作的?