在房间中更改Flowable <List <Obj1 >>为Flowable <List <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() } 

Flowable.fromIterable给出有限数量或项目,然后结束。

flatmap中的flatmap不会结束,因为Room的DAO对象会发出当前值和所有将来的更新,所以压缩在一起的database.*()调用不是有限的。 如果将一个.first()调用添加到.first()内部,则第二个版本也应该可以工作。