RxJava 对象转换

RxJava Object Transformation

这就是我想要做的:

我需要使用 RxJava 和 Retrofit 链接两个网络调用。

  1. 第一次调用检索 Observable<User>.

  2. 第二次调用检索附加信息 Observable<UserAdditionalInfo>,需要附加到先前检索的 Observable<User>

  3. 然后,检索带有附加信息的 Observable<User>

我试过 flatMap 运算符:

Observable<User> userObservable = new RestClient().getUserById(1234);
userObservable.flatMap(new Func1<User, Observable<?>>() {
    @Override
    public Observable<?> call(User user) {
        OtherRestClient otherRestClient = new OtherRestClient();

        // Second network call. It retrieves an Observable<UserAdditionalInfo>
        otherRestClient.getUserAdditionalInfo(user.getUserCode());

        // I think, here should be the code that attaches the additional info
        // to the `user` parameter of the call method and return an Observable<User>

        return null;
    }
}).subscribe(o -> System.out.println(o));

这是你需要的吗?

Observable<User> userObservable = new RestClient().getUserById(1234);
userObservable.flatMap(new Func1<User, Observable<User>>() {
    @Override
    public Observable<User> call(final User user) {
        OtherRestClient otherRestClient = new OtherRestClient();

        // Second network call. It retrieves an Observable<UserAdditionalInfo>
        Observable<UserAdditionalInfo> additionalObservable = otherRestClient.getUserAdditionalInfo(user.getUserCode());

        return additionalObservable.map(new Func1<UserAdditionalInfo, User>() {
            @Override
            public User call(final UserAdditionalInfo uai) {
                user.setXXX(uai.getXXX());
                // ... any additional calls
                return user;
            }            
        });
    }
}).subscribe(o -> System.out.println(o));

userObservable.flatMap(...)语句的return类型,如果省略最后的.subscribe(...)部分,则为Observable<User>.