【问题标题】:RxJava - Mapping a result of list to another listRxJava - 将列表的结果映射到另一个列表
【发布时间】:2018-11-15 10:46:33
【问题描述】:

我想将列表中的每个对象都转换为另一个对象。但这样做我的代码卡在将它们转换回列表

override fun myFunction(): LiveData<MutableList<MyModel>> {
    return mySdk
            .getAllElements() // Returns Flowable<List<CustomObject>>
            .flatMap { Flowable.fromIterable(it) }
            .map {MyModel(it.name!!, it.phoneNumber!!) }
            .toList() //Debugger does not enter here
            .toFlowable()
            .onErrorReturn { Collections.emptyList() }
            .subscribeOn(Schedulers.io())
            .to { LiveDataReactiveStreams.fromPublisher(it) }
}

在映射之前一切都很好。但调试器甚至不会停在 toList 或 toList 下面的任何其他位置。我该如何解决这个问题?

【问题讨论】:

  • 什么是getAllElements
  • 你为什么不直接.map {} getAllElements 返回的列表呢?你不需要平面地图
  • 也许我可以在这里,但在另一种方法中,我需要使用列表中的每个对象并与它们一起发送单独的请求。在那种情况下,我将需要 flatMap,所以我试图了解为什么 toList() 函数永远不会被执行
  • toList 未执行,因为您的平面图未传播 onComplete 事件,而 toList 正在等待该事件。阅读此github.com/ReactiveX/RxJava/issues/3861
  • 对不起,我提供了错误的信息。 getAllElements 返回 Flowable>

标签: android kotlin rx-java rx-java2


【解决方案1】:

使用flatMap(),您只会将列表的Flowable 展平为单个元素的Flowable。调用toList() 需要Flowable 才能完成,因此您很可能永远不会到达那里。如果您只想映射列表中的元素并有一个带有新列表的项目,您应该在flatMap() 内进行映射,或者尝试使用concatMap() 来保持顺序:

...
.concatMapSingle { list ->
    Observable.fromIterable(list).map {
        MyModel(it.name!!, it.phoneNumber!!)
    }.toList()
}
...

【讨论】:

  • 嗨,赞成您的回答,因为这也可以。我什么时候应该更喜欢 concatMapSingle 而不是 flatMapSingle?
  • @Cem 当您想保留项目的“原始”顺序时
  • 所以我认为如果我有多个平面地图,可以使用相同的模式。 mySdk.getAllElements() .flatMap { Flowable.fromIterable(it) } .flatMap { aMethodThatReturns Flowable} .toList() .toFlowable()
【解决方案2】:

这是我的解决方案。感谢 Tim 引导我找到正确答案。

override fun myFunction(): LiveData<MutableList<MyModel>> {
    return mySdk
            .getAllElements() // Returns Flowable<List<CustomObject>>
            .flatMapSingle { Observable.fromIterable(it).map { MyModel(it.name!!, it.phoneNumber!!) }.toList() }
            .toFlowable()
            .onErrorReturn { Collections.emptyList() }
            .subscribeOn(Schedulers.io())
            .to { LiveDataReactiveStreams.fromPublisher(it) }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多