RXJava 2 Flowable`s mergeWith not merge

时间:2017-12-08 00:19:02

标签: 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>>

我正在这样使用它:

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

如果我单独执行每个调用,则每个都返回一个元素(不同的元素),但是当我一起执行它们时,日志输出只返回一个元素。

如何将两个Flowable中的emitions合并为一个?

1 个答案:

答案 0 :(得分:3)

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

enter image description here

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

dao.currentMonth(firstDayOfMonth, lastDayOfMonth, account.uuid)
            .mergeWith(dao.currentMonth(firstDayOfMonth, lastDayOfMonth, card.uuid))
    .toList()

您将创建一个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;
})

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