kotlin - 如何使用 RxJava2 将 api 中的数据组合到域对象中?

标签 kotlin rx-java2

我有以下代码:

interface UsersApi {
  fun getUsers() : Single<List<UserTO>>
  fun getPosts(postId: String) : Single<PostTO>
}
data class UserTO(val name: String, postIds: List<String>)
data class PostTO(val title: String, val content: String)
data class User(val name: String, val posts: List<Post>)
data class Post(val title: String, content: String)

我正在尝试使用返回的方法编写一个存储库类

Single<List<User>>

但我不知道该怎么做,因为我需要访问流中较早的对象,而且 Single 令人困惑。

我很确定我必须从调用 getUsers 开始,然后调用平面图,但随后事情就会变得困惑。

有什么帮助吗?

最佳答案

如果您想从 API 加载用户并为每个用户加载他们的帖子,那么您可以执行如下操作。

flattenAsFlowable 允许您从 api 响应中迭代每个 UserTO。这样您就可以提取他们的 postId 并映射到 User 对象。

Flowable.fromIterable 允许您迭代 postIds 集合并为每个帖子执行 api 调用。

class MyRepository(private val api: UsersApi) {

    fun getUsers(): Single<List<User>> {
        return api.getUsers()
            .flattenAsFlowable { it }
            .flatMapSingle { loadUserPosts(it) }
            .toList()
    }

    private fun loadUserPosts(user: UserTO): Single<User> {
        return loadPosts(user.postIds)
            .map { User(name = user.name, posts = it) }
    }

    private fun loadPosts(postIds: List<String>): Single<List<Post>> {
        return Flowable.fromIterable(postIds)
            .flatMapSingle { api.getPosts(it) }
            .map { Post(title = it.title, content = it.content) }
            .toList()
    }
}

关于kotlin - 如何使用 RxJava2 将 api 中的数据组合到域对象中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52303830/

相关文章:

Java 泛型到 Kotlin 泛型。从方法返回泛型

android - 使用 kotlin 在非 Activity 类中使用 Toast.makeToast 时出错

android - 如何将带圆圈的计数器添加到抽屉导航中的项目

java - 眼睛指示器与 AutoCompleteTextView 中的提示错误图标重叠

rx-java - 也许可以完成

android - 无法解析方法订阅 Retrofit Rxjava android

java - RxJava2 使用带有过滤器的 retryWhen

kotlin - 在 Kotlin 文档 (KDoc) 中,是否可以链接到特定的重载方法?

java - Kotlin 中的注释不起作用

kotlin - 如何修复 Rxjava(Kotlin) 上的 subscribeWith 类型参数错误?