2017-10-07 53 views
0

我有两个观察对象发出相同的数据类型。我需要把它们合并如何对两个可观察对象使用自定义合并函数

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

现在我需要合并这两观测到一个单一的,但我并不需要有被合并,我需要使用自定义功能合并它们两个阵列,比如我想排除具有相同ID的重复帖子

使用RxJava可以达到这个目的吗?

感谢

+0

它是可能的,但是'Post.List'是一个自定义的数据结构?其实,如果你可以加入一些Post类,我可以给你一个更好的建议。 – Jon

回答

1

我要在这里作出一些假设,因为你还没有发表您的Post实现。假设我们有一个帖子列表:List<Post>

如果你想要做最脏最累的工作合并自己,你可以简单地使用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()); 

上面会做一些你问什么:

使用 flatMapIterable(...)
  • 滤出任何重复的ID使用distinct(...)
  • 收集整个流,并使用发射它作为一个单一列表210
    1. 合并使用mergeWith(...)
    2. 变换列表发射流入ÑPost排放toList()

    你可以继续转换你的列表多次,直到你得到你想要的东西编辑。