我如何合并一个<List <List >>与RxJava 2的列表?

我想要做的就是敲一个终端来获得一个用户列表,返回Single<List> 。 接下来,我想抓住前三名用户,并击中另一个端点,以获取他们的所有postSingle<List> 。 最后,我想显示一个Toast ,其中前3个用户的post总数

我已经能够用Kotlin中的flatten()函数来实现它了。 不过,我想知道如何使用RxJava 2来做到这一点。可能吗? 谢谢。

 ... getPostsForFirstThreeUsers() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe( { posts -> toast("There are: ${posts.flatten().size} posts") }, { ex -> Timber.e(ex, "there was an error processing the request") } ) fun getFirstThreeUsers(): Flowable { return getAllUsers() .flattenAsFlowable { users -> users } .doOnNext { Timber.i("a user: ${it.username}") } .take(3) } fun getPostsForFirstThreeUsers(): Single<List<List>> { return getFirstThreeUsers() .flatMapSingle { api.getUsersPosts(it.id) } .doOnNext { Timber.i("number of posts: ${it.size}") } .toList() } 

由于您只查找post的总数,因此您可以将列表flatmap到流中,然后进行count 。 平面映射不能保证顺序,但将列表的列表平整为单个流。

 getPostsForFirstThreeUsers() .subscribeOn(Schedulers.io()) .flatmapObservable(Observable::fromIterable) .flatmap(Observable::fromIterable) .count() .observeOn(AndroidSchedulers.mainThread()) .subscribe( { count -> toast("There are: ${count} posts") }, { ex -> Timber.e(ex, "there was an error processing the request") } ) 

我没有测试过这个,但我认为你可以用flatmap做这个, reduce (或collect )。 可能是这样的:

 getAllUsers() .take(3) .flatMap { api.getUsersPosts(it.id) } .map { it.size } .reduce(0) { acc, e -> acc + e } .observeOn(AndroidSchedulers.mainThread()) .subscribe( { posts -> toast("There are: ${posts.flatten().size} posts") }, { ex -> Timber.e(ex, "there was an error processing the request") } ) 

我结束了这个解决方案,它允许我有权访问整个Post对象List 。 感谢您的指导。

 fun getPostsForFirstThreeUsers(): Single> { return getFirstThreeUsers() .flatMapSingle { api.getUsersPosts(it.id) } .doOnNext { Timber.i("number of posts: ${it.size}") } .flatMapIterable { it } .doOnNext { Timber.i("the post: $it") } .toList() }