RxJava2-将多个Singles发出的结果合并到Map中

时间:2018-12-11 17:35:30

标签: android rx-java rx-java2

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

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

我需要将每个用户从列表插入本地数据库,最后得到一个HashMap<String,Long>(一个映射{{1 }}到remoteId

每个localId返回一个insertToLocalDb。因此,Single<Long>发出插入的Observable的{​​{1}}

我该如何以被动方式实现这一目标?

1 个答案:

答案 0 :(得分:2)

首先,我建议使用事务处理多个数据库操作,这就是您的情况。

一个微不足道的解决方案可能看起来像这样:

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>>,但是如果您正在使用事务处理,则第二种方法的性能要好得多。