我想将列表中的每个对象转换为另一个对象。但是这样做时,我的代码陷入了将它们转换回列表的问题
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下面的任何其他位置停止。我该怎么解决?
答案 0 :(得分:3)
使用flatMap()
只会将列表的Flowable
展平为单个Flowable
元素。在其上调用toList()
需要完成Flowable
,因此您很可能永远无法到达那里。如果您只想映射列表中的元素并有一个发出新列表的项目,则应该在flatMap()
内进行映射,或者尝试使用concatMap()
来保持顺序:
...
.concatMapSingle { list ->
Observable.fromIterable(list).map {
MyModel(it.name!!, it.phoneNumber!!)
}.toList()
}
...
答案 1 :(得分:1)
这是我的解决方案。感谢蒂姆带领我给出了正确的答案。
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) }
}
答案 2 :(得分:-1)
override fun myFunction(): LiveData<MutableList<MyModel>> {
return mySdk
.getAllElements()
.flatMap {it -> Flowable.fromIterable(it)
it.map(MyModel(it.name!!, it.phoneNumber!!) )
}
.toFlowable()
.onErrorReturn { Collections.emptyList() }
.subscribeOn(Schedulers.io())
.to { LiveDataReactiveStreams.fromPublisher(it) }
}