Как я могу построить это наблюдаемое?

#rx-java

#rx-java

Вопрос:

Мне нужна помощь в создании этого наблюдаемого. Я хочу:

  1. Получить Observable<FilmInfo> из User идентификатора
  2. Из этого FilmInfo идентификатора извлеките Film
  3. После завершения верните an Observable<UserFilm> , который содержит оба FilmInfo и Film

У меня есть это:

 @Override
public Observable<UserFilm> filmsForUser(final User user) {
    return infoStore.filmsInfoForUser(user.id())
            .flatMap(new Func1<FilmInfo, Observable<Film>>() {
                @Override
                public Observable<Film> call(final FilmInfo info) {
                    return filmsStore.get(info.id());
                }
            }).map(new Func1<Film, UserFilm>() {
                @Override
                public UserFilm call(Film film) {
                    //I need "info" here!
                }
            });
}
  

Здесь у меня есть an Observable<Film> , но мне нужно сопоставить его с an Observable<UserFilm> . Проблема в том, что я не могу использовать info переменную для построения UserFilm . Я пробовал, combineLatest но я не знаю, как его точно использовать.

Ответ №1:

Используйте перегрузку с 2 аргументами flatMap :

 @Override
public Observable<UserFilm> filmsForUser(final User user) {
    return infoStore
        .filmsInfoForUser(user.id())
        .flatMap(filmInfo -> filmsStore.get(info.id()), (filmInfo, film) -> {
             // use filmInfo, film here!
        });
}
  

Ответ №2:

Понял!

 @Override
public Observable<UserFilm> filmsForUser(final User user) {
    return infoStore.filmsInfoForUser(user.id()).flatMap(new Func1<FilmInfo, Observable<UserFilm>>() {
        @Override
        public Observable<UserFilm> call(FilmInfo info) {
            return Observable.combineLatest(Observable.just(info), filmsStore.get(info.id()),
                    new Func2<FilmInfo, Film, UserFilm>() {
                        @Override
                        public UserFilm call(FilmInfo filmInfo, Film film) {
                            //I have all I need here!
                        }
                    });
        }
    });
}