RxJava:插入对象列表及其嵌套对象

时间:2019-04-29 15:15:24

标签: android rx-java2

我有一个“用户”实体的列表,我可以使用以下命令插入所有用户:

Completable.fromAction(() -> userDao.insert(users))
.subscribeOn(Schedulers.io());

这很好。

但是,每个用户实体都有一个“地址”实体列表,例如:List。

在存储库中,我有一个AddressDao,我想链接另一个可完成的对象,以便将所有地址与用户一起插入。

它看起来应该像这样:

Completable.fromAction(() -> userDao.insert(users))
.andThen(Completable.fromAction(() -> addressDao.insert(foreach(user).address))
.subscribeOn(Schedulers.io());

但是这不能编译,因为我不知道语法,而且我不确定是否应该使用andThen。有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

要从用户列表中提取地址列表,可以使用Java 8流。

List<Address> addresses = users.stream()
    .flatMap(user -> user.address.stream())
    .collect(Collectors.toList())

完整答案:

Completable.fromAction(() -> userDao.insert(users))
    .andThen(Completable.fromAction(() -> {
        addressDao.insert(users.stream()
            .flatMap(user -> user.address.stream())
            .collect(Collectors.toList()))
    })
    .subscribeOn(Schedulers.io());


Stream仅在这里供您简化代码。如果Stream不可用,则只需简单的迭代就可以了。

final List<Address> addresses = new ArrayList<>();

for (User user: users) {
    for (Address address: user) {
        addresses.add(address);
    }
}

完整答案:

final List<Address> addresses = new ArrayList<>();

for (User user: users) {
    for (Address address: user) {
        addresses.add(address);
    }
}

Completable.fromAction(() -> userDao.insert(users))
    .andThen(Completable.fromAction(() -> addressDao.insert(addresses))
    .subscribeOn(Schedulers.io());