【问题标题】:How use custom merge function for two observables如何对两个可观察对象使用自定义合并功能
【发布时间】:2017-10-07 05:41:43
【问题描述】:

我有两个发出相同数据类型的可观察对象。我需要合并它们

    Single<Post.List> postsRecent = getRecentPosts()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
    Single<Post.List> postsPopular = getPopularPosts()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

现在我需要将这两个 observable 合并为一个,但是我不需要合并两个数组我需要使用自定义函数来合并它们,例如我想排除具有相同 id 的重复帖子

是否可以使用 RxJava 实现这一点?

谢谢

【问题讨论】:

  • 有可能,但Post.List 是自定义数据结构吗?实际上,如果您可以包含一些 Post 课程,我可以给您一个更好的建议。

标签: android rx-java rx-android rx-java2


【解决方案1】:

我将在这里做一些假设,因为您尚未发布您的 Post 实现。假设我们有一个帖子列表:List&lt;Post&gt;

如果你想自己完成所有脏合并工作,你可以简单地使用Single.zip(...)

Single.zip(getRecentPosts(), 
           getPopularPosts(),
           (posts1, posts2) -> myCustomMergeMethod(posts1, posts2))
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread());

尚不清楚您想对自定义合并做什么...但是,您几乎总是可以使用 rx 转换完成所有工作:

 getRecentPosts().mergeWith(getPopularPosts())
            .flatMapIterable(posts -> posts)
            .distinct(post -> post.getId())
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

以上内容将满足您的要求:

  1. 使用mergeWith(...)合并流
  2. 使用flatMapIterable(...) 将列表发射转换为n Post 发射
  3. 使用distinct(...)过滤掉所有重复的ID
  4. 使用toList()收集整个流并将其作为单个列表发出

您可以继续多次转换您的列表,直到得到您想要的。

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多