モケラ

Tech Sheets

mokelab

map/flatMapでObservableを変換する

最終更新日:2017-05-04

mapやflatMapを使用すると、Observableが出力したデータを変換することができます。図にすると次のような感じになります。

図中のObservableはmapによって○が△に変換されているので、全体では△を出力するObservableになります。

map

mapはObservableが出力したデータを同期的に変換し、全体として「変換後のデータを出力するObservable」を返します。

// send()はObservableを返すとする
client.send(Method.GET, "https://tech.mokelab.com", null, "")
        .map(new Function<HTTPResponse, String>() {
            @Override
            public String apply(HTTPResponse response) throws Exception {
                return response.body;
            }
        }).subscribe( /* */);

flatMap

flatMapは2つの考え方ができます。

  • Observableが出力したデータをバラバラにする
  • Observableが出力したデータを非同期で変換する

前者は、例えば前段のObservableが出力したJSONArrayをバラバラにし、JSONObjectを複数個出力するObservableにする場面で使用したりします。

後者は、非同期処理を順に行う場面で使用したりします。

あまりいい例ではありませんが、HTTPリクエストを投げ、その結果をパラメータとして次のHTTPリクエストを投げる例です。

client.send(Method.GET, "https://tech.mokelab.com", null, "")
        .flatMap(new Function<HTTPResponse, SingleSource<?>>() {
            @Override
            public Single<HTTPResponse> apply(HTTPResponse response) throws Exception {
                String params = response.body;
                return client.send(Method.GET, "https://tech.mokelab.com/api", null, params);
            }
        }).subscribe(/* */);

一覧に戻る