我正在学习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;
});
}