我有这个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。该类的完整代码就在那里。
答案 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));