结合RxJava中的observable,有更好的方法吗?

时间:2016-08-09 10:14:46

标签: rx-java

我正在学习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提供的函数存在更好/更优雅的解决方案。

1 个答案:

答案 0 :(得分:1)

好一点&#34;优雅&#34;方式: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;

          });
}