如何合并单个<list <list <t>&gt;&gt;使用RxJava 2进入List <t>?

时间:2017-06-18 23:35:18

标签: kotlin rx-java2

我想要做的是点击端点以获取用户列表,返回Single<List<User>>。接下来,我想获取前三个用户并点击另一个端点以获取他们的所有帖子Single<List<Post>>。最后,我想显示一个Toast,其中包含所有前3位用户的帖子总数

我已经能够使用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<User> {
    return getAllUsers()
            .flattenAsFlowable { users -> users }
            .doOnNext { Timber.i("a user: ${it.username}") }
            .take(3)
}

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

3 个答案:

答案 0 :(得分:3)

由于您只查找帖子总数,因此您可以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") } ) 。平面映射不保证顺序,而是将列表列表展平为单个流。

 ViewGroup parentGroup = (ViewGroup) requestsListView.getParent();
    View empty = getActivity().getLayoutInflater().inflate(R.layout.empty_view,
            parentGroup,
            false);
    parentGroup.addView(empty);
    requestsListView.setEmptyView(empty);

答案 1 :(得分:2)

我没有对此进行过测试,但我认为您可以使用flatmapreduce(或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") }
   )

答案 2 :(得分:1)

我最终使用此解决方案,这使我可以访问整个ListPost个对象。谢谢你的指导。

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