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

Android RxJava-将列表的结果映射到另一个列表,android,kotlin,rx-java,rx-java2,Android,Kotlin,Rx Java,Rx Java2,我想将列表中的每个对象都转换为另一个对象。但在这样做的过程中,我的代码阻碍了将它们转换回列表 override fun myFunction(): LiveData<MutableList<MyModel>> { return mySdk .getAllElements() // Returns Flowable<List<CustomObject>> .flatMap { Flowable.

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

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) }
}
override fun myFunction():LiveData{
返回mySdk
.getAllegements()//返回可流动的
.flatMap{Flowable.fromIterable(it)}
.map{MyModel(it.name!!,it.phoneNumber!!)}
.toList()//调试器未在此处输入
.toFlowable()
.onErrorReturn{Collections.emptyList()}
.subscribeOn(Schedulers.io())
.to{LiveDataReactiveStreams.fromPublisher(it)}
}
在映射之前一切都很好。但调试器甚至不会在toList或toList以下的任何其他位置停止。如何解决此问题?

使用
flatMap()
您将只将
可流动的
列表展平为单个
可流动的
。在其上调用
toList()
需要完成
可流动的
,因此您很可能永远无法到达那里。如果您只想映射列表中的元素并发出新列表中的项目,则应在
flatMap()
中进行映射,或者尝试使用
concatMap()
来保持顺序:

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

这是我的解决办法。谢谢蒂姆给了我正确的答案

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) }
}
override fun myFunction():LiveData{
返回mySdk
.getAllegements()//返回可流动的
.flatMapSingle{Observable.fromIterable(it).map{MyModel(it.name!!,it.phoneNumber!!)}.toList()}
.toFlowable()
.onErrorReturn{Collections.emptyList()}
.subscribeOn(Schedulers.io())
.to{LiveDataReactiveStreams.fromPublisher(it)}
}

什么是GetAllegement为什么不将GetAllegements返回的列表映射到{}
?您不需要FlatMap,也许我可以在这里,但在另一种方法中,我需要使用列表中的每个对象,并与它们一起发送单独的请求。在这种情况下,我需要flatMap,所以我试图了解为什么toList()函数永远不会被执行toList不会被执行,因为flatMap不会传播onComplete事件,而toList正在等待。读这个对不起,我提供了错误的信息。GetAllegements返回FlowableHi,对您的答案进行投票,因为这也会起作用。什么时候我应该更喜欢concatMapSingle而不是flatMapSingle?@Cem当你想保留项目的“原始”顺序时,如果我有多个平面图,我认为可以使用相同的模式。mySdk.getAllegements().flatMap{Flowable.fromIterable(it)}.flatMap{methodthattreturns Flowable}.toList().toFlowable()