Обработка списков с помощью RxJava и дооснащение в android

У меня есть пара вызовов api, чтобы сделать (последовательно, асинхронно), а некоторые из них возвращают списки. Интерфейс api приведен ниже.

@GET("/users/settings")
Observable<UserWrapper> getUserSettings();

@GET("/{username}/collections")
Observable<List<Item>> getItems(@Path("username") String userName);

@GET("/item/{id}")
Observable<ItemInfo> getItemInfo(@Path("id") int id);

@GET("/{username}/friends")
Observable<List<Friend>> getFriends(@Path("username") String userName);

Вот что я хочу сделать последовательно:

  • Получить UserWrapper, вызвав getUserSettings()
  • Сохраните пользователя, позвонив saveUser(userWrapper)
  • Получить пользовательские элементы, вызвав getItems(userWrapper.getUserName())
  • Получить информацию о каждом элементе, вызвав getItemInfo(item.getId())
  • Сохраните каждый itemInfo, вызвав saveItem(itemInfo)
  • Получить друзей пользователей, позвонив getFriends(userWrapper.getUserName())
  • Сохраните каждого друга, позвонив saveFriend(friend)

Теперь я новичок в RxJava и не знаю, как обрабатывать списки. Я наблюдал за одним из слайдов Jake Wharton и обнаружил, что он использует функцию flattenList(), но я не знаю ее определения. Было бы здорово, если бы вы могли помочь составить эту цепочку.


Обновление 1

Это до сих пор я получил:

mApiService.getUserSettings()
            .map(this::saveUser)
            .flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()));
            .flatMapIterable( ? "How to iterate for each item" ? );

Обновление 2

Я пытаюсь написать что-то вроде этого

mApiService.getUserSettings()
    .map(this::saveUser)
    .flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName()))
    .someMethodToIterateThroughEachItem(item -> mApiService.getItemInfo(item))
    .map(this::saveItem)
    .someMethodThatCanCallUserWrapperAgain(userWrapper -> mApiService.getFriends(userWrapper.getUserName()))
    .someMethodToIterateThoughEachFriend(friend -> saveFriend(friend))

Ответ 1

RxJava добавил flatMapIterable. Так что теперь вам не нужно flattenList. Например.

  Observable<UserWrapper> o =
       getUserSettings()
       .doOnNext(this::saveUser)
       .flatMap(user -> getItems(user.getUserName())
                        .flatMapIterable(items -> items)
                        .flatMap(item -> getItemInfo(item.getId()))
                        .doOnNext(this::saveItem)
                        .toList()
                        .map(ignored -> user))
        .flatMap(user -> getFriends(user.getUserName())
                         .flatMapIterable(friends -> friends)
                         .doOnNext(this::saveFriend)
                         .toList()
                         .map(ignored -> user)
        );
    o.subscribe(...);