将单个<user>的Flowable转换为Flowable of List <user>

时间:2017-11-20 21:14:24

标签: android rx-java rx-java2

我有这个Rx Stream,用于将UserScoreTO列表分组到一个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 个答案:

答案 0 :(得分:2)

最后放置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));