2016-08-09 4 views
0

私はRxJavaを学んでいます。私は2つのAPIから映画情報を取得しています。RxJavaで観測可能なものを結合するより良い方法がありますか?

  • 第1のAPI(Api1クラス)idを受信し、JSON(Api1Dtoクラス)を返し:

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

  • を第2のAPI(Api2クラス)api2id戻るを受信しますJSON(Api2Dtoクラス):

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

私はすべてのこれらのフィールド(Filmクラス)で構造を構成する、idから、欲しい:

{ 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

ちょっと良い "エレガントな"方法:flatMapmapの仕事をすることができます。

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; 

      }); 
} 
関連する問題