map/flatMapでObservableを変換する
最終更新日:2024-08-09
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(/* */);