android - 由于flatMap未完成,因此FlatMap失败后RxJava使用toList

标签 android kotlin rx-java rx-java2

我有三个对象(例如A,B,C),要获取CI,需要B,要获取A,我需要B。在屏幕上,我需要同时显示A的属性和C的属性。即使我可以所有必需的数据,因为我使用了不带onComplete的flatMap,因此不会执行toList()。这是我的代码。

对于每个in列表,我都需要获取c,并且需要返回ResultMode类型的列表,其中包括a和c的属性。

override fun methodICall(): LiveData<MutableList<ResultModel>> {
        return mySdk
                .getAllA() //Returns Flowable<List<A>>
                .flatMap { Flowable.fromIterable(it) }
                .flatMap { helperMethod(it) }
                .toList() // Does not get executed as flatMap isnt completed
                .toFlowable()
                .onErrorReturn { Collections.emptyList() }
                .subscribeOn(Schedulers.io())
                .to { LiveDataReactiveStreams.fromPublisher(it) }
    }

    private fun helperMethod(a:A): Flowable<ResultModel> {
        return mySdk
                .getB(a.propertyOne!!) // Returns Single<B>
                .flatMap { mySdk.getC(it.property!!) } // get C returns Single<C>
                .map {
                    ResultModel(name= a.name,
                            date = c.date.toString(), 
                            message = it.messageId!!
                         )
                }.toFlowable()
    }

注意:我今天早些时候问过一个类似的问题,但是并不需要多次使用平面图。您可以在此链接中查看我的解决方案

RxJava - Mapping a result of list to another list

我的努力(可能错了)
这是我转换第一种方法的工作(对于第二种方法,我只是将其删除为Flowable并返回单一方法),但是还有很长的路要走,我认为我走错了路。
 override fun methodICall(): LiveData<MutableList<ResultModel>> {
        return mySdk
                .getAllA()
                .concatMapSingle { Flowable.fromIterable(it)
                        .map { helperMethod(it) }
                        .toList()
                }
                .onErrorReturn { Collections.emptyList() }
                .subscribeOn(Schedulers.io())
                .to { LiveDataReactiveStreams.fromPublisher(it) // here it is single. I think it is because two maps are applied both to helperMethod itself and inside helper method to result model}
    }

最佳答案

似乎没有充分的理由不断解构和重建列表。假设没有:

override fun methodICall(): LiveData<MutableList<ResultModel>> {
        return mySdk
                .getAllA() // Returns Flowable<List<A>>
                .flatMapIterable(it)
                .concatMapSingle( item => {
                  mySdk.getB(item.propertyOfA!!)
                    .flatMap( bItem => mySdk.getC( bItem.propertyOfB!! ) )
                    .map( ResultModel( name=item.name, message=it.body!! ) )
                 })
                .toList()
                .onErrorReturn { Collections.emptyList() }
                .subscribeOn(Schedulers.io())
                .to { LiveDataReactiveStreams.fromPublisher(it) }
    }

由于concatMapSingle()运算符知道每个项目,因此可以在构造ResultModel时知道其名称。现在,您不再需要如此频繁地将事情拆散。

关于android - 由于flatMap未完成,因此FlatMap失败后RxJava使用toList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53324132/

相关文章:

Android 文件传输看不到应用程序创建的文件夹

Gradle Kotlin DSL : get sourceSet of another project

java - FlatMap 是一个可迭代对象,并将其组合回可迭代对象

android - 在android中发送对距离矩阵的请求集合

javascript - jQuery Mobile slider 根据其值触发不同的事件

java - Kotlin 中的包等效可见性修饰符

java - 将 Realm 与 RxJava 2 结合使用

java - 如何使用 rxJava 发出多重请求

java - 无法将数据添加到非 Activity 类中声明的 HashMap

functional-programming - Kotlin 不同类型的 reduce() 函数