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
的对象)
每个insertToLocalDb
returns一个Single<Long>
。因此,Observable
发出插入的 User
的 localId
我怎样才能以反应方式实现这一点?
首先,我必须建议对多个数据库操作使用一个事务,这就是你的情况。
一个简单的非性能解决方案可能如下所示:
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>>
,但如果您使用的是事务,则第二种方法的性能要高得多。
我从服务器获取了一个List<User>
。
class User {
Long localId;
String remoteId;
..
}
我需要将 list 中的每个用户插入 local db,最后得到一个 HashMap<String,Long>
(将 remoteId
映射到 localId
的对象)
每个insertToLocalDb
returns一个Single<Long>
。因此,Observable
发出插入的 User
的 localId
我怎样才能以反应方式实现这一点?
首先,我必须建议对多个数据库操作使用一个事务,这就是你的情况。
一个简单的非性能解决方案可能如下所示:
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>>
,但如果您使用的是事务,则第二种方法的性能要高得多。