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()