RXJava 2 Flowable 的合并不合并

jon*_*nrz 4 android rx-java2

我的 Room`s dao 上有这个方法

@Query("SELECT * FROM Expense WHERE date >= :initDate AND date <= :endDate AND chargeableUuid = :chargeableUuid ORDER BY date")
fun currentMonth(initDate: Long, endDate: Long, chargeableUuid: String): Flowable<List<Expense>>
Run Code Online (Sandbox Code Playgroud)

我是这样使用它的:

dao.currentMonth(firstDayOfMonth, lastDayOfMonth, account.uuid)
            .mergeWith(dao.currentMonth(firstDayOfMonth, lastDayOfMonth, card.uuid))
            .subscribe { Log.i("test", "size ${it.size}" }
Run Code Online (Sandbox Code Playgroud)

如果我分别执行每个调用,每个调用都返回一个元素(不同的元素),但是当我一起执行它们时,日志输出只有一个元素在返回的列表中。

如何将两个 Flowables 的发射合并为一个?

GVi*_*i82 7

当您使用merge(or mergeWith) 运算符时,如您在图中所见,您将拥有一个 Observable,它发出从所有Observable(或Flowable您正在合并)发出的所有项目。

在此处输入图片说明

所以,实际上你的订阅者会收到两个 List。如果您只想要一个Flowable发出一个包含所有列表中包含的所有项目的单个项目(一个列表),您可以使用toList运算符:

正在做

dao.currentMonth(firstDayOfMonth, lastDayOfMonth, account.uuid)
            .mergeWith(dao.currentMonth(firstDayOfMonth, lastDayOfMonth, card.uuid))
    .toList()
Run Code Online (Sandbox Code Playgroud)

您将创建一个Flowable发出列表的列表,List<List< Expense>>该列表将包含您的两个列表。所以你可以map在一个列表中:

dao.currentMonth(firstDayOfMonth, lastDayOfMonth, account.uuid)
   .mergeWith(dao.currentMonth(firstDayOfMonth, lastDayOfMonth, card.uuid))
    .toList()
    .map(lists -> {
     List<Expense> l = new ArrayList<>();
     for (List<Expense> list : lists) {
          l.addAll(list);
     }
     return l;
})
Run Code Online (Sandbox Code Playgroud)

如果您现在订阅,您将获得一个包含两个Expense对象的列表。