如何将可流动清单转换为具有前一项总和的新可流动清单

问题描述

这是非常基础的,但是我对RxJava还是很陌生,无法为我的查询找到合适的解决方案。

查询就像,我正在获取可流动(单流)列表,并想将其再次转换为新的可流动(不是逐项观察),作为初始列表。转换为新的可流动清单时,每个项目应具有最后一项的累积总和。

var cumulativeSum: Double = 0.0
var firstObservable: Flowable<List<Items>> = repo.getQuery()
var secondobservale: Flowable<List<Items>> = firstObservable.
.flatMapIterable{list -> list}
.map{ item ->
      cumulativeSum += it.qty
      it.totalQty = cumulativeSum
 }
.toList()

如果有人可以通过上述查询为我提供帮助,为什么secondobservable不是Flowable项目列表?我将其作为单位的单个列表获取。 否则,这不是正确的转换方式。

请帮助我,我如何才能达到预期的效果

解决方法

如果使用flatMap系列api,它将使数据变平,并且可能会丢失初始列表。

firstObservable.flatMapIterable{list -> list} // This will be converted to Flowable<Items>

此外,map()运算符可以将您的对象转换为其他对象。如果只想保留Items对象,而只想更改内部变量,请使用'doOnXXX()'运算符。

var secondObservale: Flowable<List<Items>> = firstObservable
    .doOnNext {
        it.fold(0.0) { acc,items ->
            items.totalQty = acc + items.qty
            items.totalQty
        }
    }

请告诉我我有什么问题。

更新

我认为RxJava的核心功能是 concurrency 。我不确定这种情况是否是您想要的,但是如果要同时运行每个任务,请尝试以下代码。

var secondObservale: Flowable<List<Items>> = firstObservable
    .parallel(4) // max concurrency: 4
    .runOn(Schedulers.computation())
    .doOnNext {
        it.fold(0.0) { acc,items ->
            items.totalQty = acc + items.qty
            items.totalQty
        }
    }
    .sequential()