RxJava: вставка списка объектов, а также вложенных объектов - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть список «пользовательских» сущностей, я могу вставить всех пользователей с помощью:

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

Это отлично работает.

Однако каждый пользовательский объект имеет список объектов «Адрес», например: Список.

В хранилище у меня есть AddressDao, я хочу связать еще один завершаемый файл, чтобы вставить все адреса вместе с пользователями.

Это должно выглядеть примерно так:

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

Но это не компилируется, потому что я не знаю синтаксис, и я не уверен, должен ли я использовать andThen. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 29 апреля 2019

Чтобы извлечь список адресов из списка пользователей, вы можете использовать поток 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 недоступен, просто итерация тоже подойдет.

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());
...