如何在Observable<Double>中计算平均值?关于RxJava2Extensions的疑问
关于RxJava2Extensions聚合方法返回类型的解释
这确实是个值得探讨的点——从直觉上来说,像平均值、最小值这类聚合计算只会产生0或1个结果,用Single/Maybe来承载似乎更合理。不过RxJava2Extensions里的MathFlowable系列方法设计成返回Flowable,主要有这几个原因:
- 与原生RxJava操作符的一致性:原生RxJava里的类似聚合操作(比如
Flowable.averageDouble())本身也是返回Flowable<Double>,而非Single/Maybe。RxJava2Extensions作为风格统一的扩展库,为了保持API体验的连贯性,延续了这个设计思路。 - 背压支持的连贯性:
Flowable是RxJava中唯一原生支持背压的流式类型,虽然聚合计算的最终结果量极小,但如果上游数据源是一个支持背压的Flowable,保持返回Flowable可以让整个调用链的背压策略统一,避免因类型转换带来的额外复杂度。 - 空输入场景的兼容处理:当上游
Flowable为空时,MathFlowable的部分方法(比如averageDouble)会发射NaN而非不产生任何数据,这时候用Flowable可以自然承载这个结果;如果改用Maybe,空输入场景下需要额外的逻辑适配,反而提升了使用成本。
如果你更倾向于用Single/Maybe来接收这类聚合结果,可以通过简单的操作符转换实现:
// 转换为Single(适用于确定上游非空的场景) MathFlowable.averageDouble(Flowable.range(1, 10)) .singleOrError() .test() .assertResult(5.5); // 转换为Maybe(适配空输入场景) MathFlowable.min(Flowable.empty()) .firstElement() .test() .assertEmpty();
这样既保留了RxJava2Extensions的便捷计算能力,又能适配你期望的返回类型。
内容的提问来源于stack exchange,提问作者Alex Kornakov
相关产品推荐
相关产品推荐

