2017-10-07 5 views
0

J'ai deux observables émettant le même type de données. Je dois les fusionnerComment utiliser la fonction de fusion personnalisée pour deux observables

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

Maintenant, je dois fusionner ces deux observables en seul, mais je ne ai pas besoin d'avoir les deux tableaux à fusionner je besoin d'utiliser la fonction personnalisée pour les fusionner, par exemple, je Voulez-vous exclure les publications en double ayant le même ID

Est-il possible d'y parvenir en utilisant RxJava?

Merci

+0

est possible, mais 'Post.List' est-il une structure de données personnalisée? En fait, si vous pouviez inclure une partie de votre classe 'Post', je pourrais vous donner une meilleure suggestion. – Jon

Répondre

1

Je vais faire quelques hypothèses ici puisque vous avez encore publier votre application Post. Supposons que nous avons une liste de postes: List<Post>.

Si vous voulez faire toute la fusion sale travail vous-même, vous pouvez simplement utiliser Single.zip(...)

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

On ne sait pas exactement ce que vous voulez faire avec votre fusion personnalisé ... Cependant, vous peut presque toujours faire tout le travail avec des transformations rx:

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

ci-dessus fera partie de ce que vous demandiez:

  1. fusionner les flux à l'aide mergeWith(...)
  2. transformer une émission de liste en nPost émissions à l'aide flatMapIterable(...)
  3. filtrer les ids en double en utilisant distinct(...)
  4. recueillir la totalité du flux et émettons comme une liste unique à l'aide toList()

Vous pouvez continuer à transformer votre liste plusieurs fois jusqu'à obtenir ce que vous voulez éd.