Измените Flowable ‹Список ‹Obj1›› на Flowable ‹Список ‹Obj2›› в комнате

Как я могу прочитать плавный список значений из комнаты и преобразовать его в другой объект, который представляет собой комбинацию большего количества значений из комнаты

database.leadsDao().getLeads(leadState.name)
    .flatMap {
        val len = it.size.toLong()
        Flowable.fromIterable(it)
            .flatMap {
                Flowable.zip(
                        database.orderDao().getById(it.orderId),
                        database.orderMedicineDao().getByOrderId(it.orderId),
                        database.patientDao().getById(it.patientId),
                        Function3<Order, List<OrderMedicine>, Patient, LeadDetail>
                        { order, orderMedicines, patient -> LeadDetail.from(it, patient, order, orderMedicines) })
            }
            .take(len)
            .toList()
            .toFlowable()
    }

Приведенный выше код работает, но мне не нравится take(len) часть. А без него поток никогда не обращается к следующему абоненту. Поток продолжает ждать новых элементов, чего не должно происходить, поскольку Flowable.fromIterable дает конечное количество элементов и затем завершается. То есть приведенный ниже код не работает

database.leadsDao().getLeads(leadState.name)
    .flatMap {
        Flowable.fromIterable(it)
            .flatMap {
                Flowable.zip(
                        database.orderDao().getById(it.orderId),
                        database.orderMedicineDao().getByOrderId(it.orderId),
                        database.patientDao().getById(it.patientId),
                        Function3<Order, List<OrderMedicine>, Patient, LeadDetail>
                        { order, orderMedicines, patient -> LeadDetail.from(it, patient, order, orderMedicines) })
            }
            .toList()
            .toFlowable()
    }

person Sourabh    schedule 27.08.2017    source источник


Ответы (1)


Flowable.fromIterable дает конечное количество элементов и затем завершается.

Но Flowable.zip внутри flatmap не закончится, поскольку объекты DAO Room испускают текущее значение И все будущие обновления, поэтому database.*() вызовы, которые объединены вместе, не являются конечными. Если вы добавите .first() вызов к внутреннему Flowable.zip, вторая версия также должна работать.

person Kiskae    schedule 28.08.2017
comment
Итак, вы рекомендуете использовать Single.zip(room.dao().get().firstOrError(), ...).toFlowable() или есть способ лучше? - person Sourabh; 29.08.2017
comment
Скорее .flatMapSingle { Flowable.zip(...).firstOrError() }, кажется, лучше подходит к проблеме - person Kiskae; 29.08.2017