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

RxJava2 - Combine multiple Singles emitted results into a Map

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

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

我需要将 list 中的每个用户插入 local db,最后得到一个 HashMap<String,Long> (将 remoteId 映射到 localId 的对象)

每个insertToLocalDbreturns一个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>>,但如果您使用的是事务,则第二种方法的性能要高得多。