在RxJava中结合可观察对象,是否有更好的方法来做到这一点



我正在学习RxJava。我正在从两个API检索电影信息。

  • 第一个API (Api1类)接收id并返回JSON (Api1Dto类):

{ id : "123456", title : "Top Secret", api2Id : "7787" }

    第二个API (Api2类)接收api2id并返回JSON (Api2Dto类):

{api2Id : "58582", "director" : "Peter Jackson" }

我想,从一个id,组成一个结构与所有这些字段(Film类):

{ id: "123456", title : "Muahaha", api2Id : "5552", director : "Uncle Joe" }

我有这样的代码:

 public Observable<Film> getById(final String id) {
        return api1.getById(id).map(new Func1<Api1Dto, Film>() {
            @Override
            public Film call(Api1Dto dto1) {
                Film film = new Film();
                film.id = dto1.id;
                film.title = dto1.title;
                film.api2Id = dto1.api2Id;
                return film;
            }
        }).flatMap(new Func1<Film, Observable<Film>>() {
            @Override
            public Observable<Film> call(final Film film) {
                return api2.getById(film.api2Id).map(new Func1<Api2Dto, Film>() {
                    @Override
                    public Film call(Api2Dto dto2) {
                        film.director = dto2.director;
                        return film;
                    }
                });
            }
        });
    }

它可以工作,但我想知道这是否是正确的方法,或者存在一个更好/更优雅的解决方案,使用RxJava提供的函数。

一个更好的"优雅"的方式:flatMap可以为你做map的工作。

 public Observable<Film> getById(final String id) {
    return api1.getById(id).map(dto1 -> {
            Film film = new Film();
            film.id = dto1.id;
            film.title = dto1.title;
            film.api2Id = dto1.api2Id;
            return film;
          }).flatMap(film -> api2.getById(film.api2Id), (film, dto2) -> {
                                      film.director = dto2.director;
                                      return film;
          });
}

最新更新