2017-11-20 7 views
0

UserScoreTO 목록을 단일 사용자 개체 (다 대일 관계)로 그룹화하는 데 사용 된이 Rx Stream을 보유하고 있습니다.Flowable of Single의 <User>을 Flowable of List로 변환 <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 소비 내가 가입이 유동성을 소비합니다. 그래서 나는 그 싱글을 구독한다. 비록 이것이 효과적 일지라도 약간 짜증이납니다 ... 나는 단지 하나의 구독을하고 사용자 컬렉션을 소비하고 싶습니다 ...

며칠 전에 나는 다른 질문을했습니다 about this same code. 그 클래스의 전체 코드가 있습니다.

답변

1

끝에 flatMap을 넣으면 그 중첩 된 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'은 정확히 이것을 수행하며 빠릅니다. –