RxJava - 将列表结果映射到另一个列表

3

我想将列表中的每个对象转换为另一个对象。但在这样做时,我的代码在将它们转换回列表时出现了问题。

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。我该怎么解决?


为什么不直接使用 .map {} 处理 getAllElements 返回的列表呢?你不需要使用 flatmap。 - Tim
也许我可以在这里做到,但是在另一个方法中,我需要使用列表中的每个对象并通过它们发送单独的请求。在那种情况下,我将需要使用flatMap,所以我正在尝试了解为什么不会执行toList()函数。 - Cem
抱歉,我提供了错误的信息。getAllElements返回Flowable<List<CustomObject>>。 - Cem
如果它没有传播 onComplete,那么调试器就不应该进入 map,但它确实进入了吗? - Cem
好的,我会帮你解答最后一个问题。在这种情况下,flatMapSingle是否有帮助呢? - Cem
显示剩余7条评论
2个回答

6
使用flatMap(),您只需要将列表的Flowable展开为单个元素的Flowable。在其上调用toList()需要Flowable完成,因此您很可能永远无法完成操作。如果您只想映射列表中的元素并发出新列表的项,则应在flatMap()中进行映射,或者尝试使用concatMap()以保持顺序:
...
.concatMapSingle { list ->
    Observable.fromIterable(list).map {
        MyModel(it.name!!, it.phoneNumber!!)
    }.toList()
}
...

嗨,我已经点赞你的回答,因为这也是可行的。什么情况下应该使用concatMapSingle而不是flatMapSingle? - Cem
@Cem 当您想要保留项目的“原始”顺序时 - Tim
所以我认为如果我有多个 flat map,可以使用相同的模式。 mySdk.getAllElements() .flatMap { Flowable.fromIterable(it) } .flatMap { aMethodThatReturns Flowable<CustomObject>} .toList() .toFlowable() - Cem

1

这是我的解决方案。感谢 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) }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接