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

时间:2018-11-15 10:46:33

标签: android kotlin rx-java rx-java2

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

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下面的任何其他位置停止。我该怎么解决?

3 个答案:

答案 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) } }