【问题标题】:Transform a Flowable of Single's<User> into a Flowable of List<User>将 Single's<User> 的 Flowable 转换为 List<User> 的 Flowable
【发布时间】:2017-11-20 21:14:24
【问题描述】:

我有这个 Rx 流,用于将 UserScoreTO 列表分组到单个用户对象(多对一关系)中。

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);

        }
    }));

}

如你所见,为了消费这个 flowable,我订阅了它,消费了它发出的一些 Single's。所以我也订阅了那张单曲。虽然这甚至可以工作,但有点烦人......我只想订阅一个并消费一组用户......

几天前我问了另一个问题about this same code。该类的完整代码在那里。

【问题讨论】:

    标签: android rx-java rx-java2


    【解决方案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));
    

    【讨论】:

    • 这就是我需要的!
    • 等等..我需要一个用户列表...但我做了 .toList().subscribe(list -> list.forEach(System.out::println)) 就是这样...
    • 请注意 - 有一个 .flatMapSingle 可以做到这一点并且速度更快。
    • @TassosBassoukos 哦,我不知道那个,谢谢!然后,在使用flatMapSingle 的情况下,它将被写为.flatMapSingle(it -&gt; it)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多