2017-11-20 5 views
0

UserScoreTOのリストを単一のUserオブジェクトにグループ化するために使用されたこのRx Streamを持っています(多対1の関係)。Flowable of Singleの<User>をFlowableのリストに変換する<User>

public void execute() { 
    getUsers() 
      .flatMap(list -> Flowable.fromIterable(list)) 
      .groupBy(userScoreTO -> userScoreTO.id) 
      .flatMap(groups -> Flowable.fromCallable(() -> groups.collect(User::new, (user, userscore) -> { 
       user.id = userscore.id; 
       user.name = userscore.name; 
       user.totalScore += userscore.score; 
      }))).subscribe(userSingle -> userSingle.subscribe(new SingleObserver<User>() { 
     @Override 
     public void onSubscribe(Disposable d) { 
      System.out.println("onSubscribe"); 
     } 

     @Override 
     public void onSuccess(User user) { 
      System.out.println(user); 
     } 

     @Override 
     public void onError(Throwable e) { 
      System.out.println(e); 

     } 
    })); 

} 

あなたは、私はそれが放出する一部のSingle'sを消費し、それに加入し、この流動性のを消費するために、見ることができるように。だから私はそのシングルも購読している。これは動作しますが、少し面倒です...私は1つのサブスクリプションを作成し、ユーザーのコレクションを消費したいと思います...

私は別の質問about this same codeを尋ねました。そのクラスの完全なコードがそこにあります。最後にflatMapを置く

答えて

1

は、そのネストされたsubscribeする必要がなくなります。

例:

getUsers() 
    .flatMap(list -> Flowable.fromIterable(list)) 
    .groupBy(userScoreTO -> userScoreTO.id) 
    .flatMap(groups -> 
     Flowable.fromCallable(() -> 
      groups.collect(User::new, (user, userscore) -> { 
       user.id = userscore.id; 
       user.name = userscore.name; 
       user.totalScore += userscore.score; 
      } 
    ))) 
    .flatMap(it -> it.toFlowable()) // <-- unwrap the singles 
    .subscribe(user -> System.out.println(user)); 
+0

私は必要なものです! – alexpfx

+0

待ちました。私はユーザーリストが必要でした...しかし、私は.toList()。subscribe(list-> list.forEach(System.out :: println))しました。それはそれです... – alexpfx

+0

'.flatMapSingle'はこれを正確に行い、より高速です。 –

関連する問題