android - RxJava2 - 将多个 Singles 发出的结果组合成一个 Map

标签 android rx-java rx-java2

我取一个 List<User>从服务器。

class User {
  Long localId;
  String remoteId;
  ..
}

我需要将列表中的每个用户插入本地数据库,最后得到一个HashMap<String,Long>。 (将 remoteId 映射到 localId 的对象)

每个insertToLocalDb返回 Single<Long> .因此,Observable发出插入的 UserlocalId

我怎样才能以一种被动的方式实现这一点?

最佳答案

首先,我必须建议对多个数据库操作使用一个事务,这就是你的情况。

一个简单的非性能解决方案可能如下所示:

fetchUsers()
  .flatMap { users ->
        Observable.fromIterable(users)
            .flatMapSingle { user -> dao.save(user) }
            .toList()
            .map { databaseIds ->
                val remoteIds = users.map { it.remoteId }
                databaseIds.zip(remoteIds).toMap()
            }

但考虑到交易,Room例如支持这个,它可以像这样:

fetchUsers().flatMap { users ->
        dao.saveAll(users) // typically returns Single<List<Long>>
            .map { databaseIds ->
                val remoteIds = users.map { it.remoteId }
                databaseIds.zip(remoteIds).toMap()
            }
    }

两者都会导致 Single<Map<String, Long>> ,但如果您使用的是事务,则第二种方法的性能要高得多。

关于android - RxJava2 - 将多个 Singles 发出的结果组合成一个 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53729459/

相关文章:

android - 使用 Retrofit 时如何在离线时对 API 调用进行排队

java - RX java 将可观察量与一对多关系相结合

android - 带正则表达式的过滤器适配器

android - 如何区分16 :9 display from a 18:9 one?

android - 使用 Java 应用引擎的 GCM 服务器无法正常工作

android - Java 8 "Optional"不好的做法?

java - 如何将 Retrofit 和 RxJava 与多个 pojo 类一起使用?

android - 如何初始化谷歌地图,以便放置的标记在 android 中可见

java - 具有太多 Observable 的 RxJava1 StackOverflow 异常

android - RxJava toList() 不触发 subscribe() 方法(使用 Room)