RXJava处理嵌套调用

Tib*_*ibo 1 android rx-java retrofit

想象一下,我有一个服务来检索一些作者(id,名字,姓氏,生日,国籍)和第二个服务来检索作者的书(标题,摘要,页数).我希望我的网络电话会给我一份带有他们书籍的作者名单.

为了说明,我的服务会返回AuthorOResponse和BookResponse,我想发出一个Observable of AuthorObject.

public class AuthorResponse {
    private String id;
    private String firstname;
    private String lastname;
    private Date birthday;
    private String nationality;
}

public class BookResponse {
    private String title;
    private String summary;
    private int pageNumber;
}

public class AuthorObject {
    private String id;
    private String firstname;
    private String lastname;
    private Date birthday;
    private String nationality;
    private List<BookObject> books
}
Run Code Online (Sandbox Code Playgroud)

我的服务就像是

Observable<List<AuthorResponse>> getAuthors()
Observable<List<BookResponse>> getAuthorBooks(String authorId)
Run Code Online (Sandbox Code Playgroud)

我想用它们来发出一个Observable,但由于我对getAuthorBooks的每次调用都需要一个作者,所以无法弄明白怎么做.

我想出了一些看起来像这样的东西,但我有一个问题,因为我的concatMap让我"松散"了我的作者.

myServices.getAuthors()
                .map(author -> createAuthor())
                .concatMap(author -> mWebService.getAuthorBooks(author.getId())
                .flatMapIterable(data -> data.items)
                .map(book -> addBook())
Run Code Online (Sandbox Code Playgroud)

有人知道我怎么做吗?

Mak*_*dov 6

您可以使用针对此类情况设计的特殊flatMap过载:

myServices.getAuthors()
    .map(author -> createAuthor())
    .flatMap(author -> mWebService.getAuthorBooks(author.getId()),
            (author, data) -> {
                author.setBooks(data.items));
                return Observable.just(author);
            })
    .toList() //here is your Observable<List<Author>>
Run Code Online (Sandbox Code Playgroud)