Я пытаюсь сделать два вызова API и объединить их, назначить второй результат для первого. Сначала я думал об использовании zipWith
, но для второго вызова мне нужен идентификатор пользователя из ответа первого:
@GET("users")
fun getUsers(): Single<List<User>>
@GET("users/{userId}/repos")
fun getUserRepositories(@Path("userId") userLogin: String): Single<List<Repository>>
И объект пользователя выглядит так:
data class User(
val id: Int,
val login: String,
val repositories: List<Repository>
)
Поэтому я хотел бы получить список пользователей, а затем для каждого пользователя получить список своих репозиториев и назначить эти репозитории пользователю. Я провел некоторое исследование и нашел решение для аналогичной проблемы с использованием flatMap
. Теперь я хотел бы сделать что-то вроде этого, но в моем случае у меня есть список объектов в ответ на первый запрос, и я не знаю, как с этим справиться. Сейчас я придумал что-то вроде этого:
private fun getUsers(): Single<List<User>> {
return api.getUsers()
.flatMap { users ->
Single.zip(users.map { user ->
api.getUserRepositories(user.login)
}, { it.map {it as List<Repository> } })
.map { repositories ->
users.mapIndexed { index, user ->
User(
id = user.id,
login = user.login,
repositories = repositories[index]
)
}
}
}
}
Это работает, но я чувствую, что это не лучший способ сделать это. Кто-нибудь знает, как этого добиться с помощью лучшего, более чистого решения?