Kotlin中如何为从Firebase获取的Double类型Mutable List编写求和函数
Kotlin 适配Firebase场景的Double类型MutableList求和实现
针对存储Double元素的MutableList求和需求,结合从Firebase拉取数据的常见兼容性问题,可按实际场景选择以下实现:
基础版(已完成类型校验的纯Double列表)
如果你的列表已经完成全量类型校验,确定是无空值、元素统一为Double类型的MutableList<Double>,可直接写自定义扩展函数实现累加逻辑,也方便后续在累加流程中加埋点、阈值校验等定制逻辑:
fun MutableList<Double>.calcSum(): Double { var total = 0.0 for (item in this) { total += item } return total }
- 这类实现的计算逻辑和Kotlin标准库内置的
sum()方法效果一致,自定义的优势是支持灵活扩展逻辑。 - 如果没有定制需求,直接调用
yourList.sum()也能快速得到结果。
健壮版(适配Firebase原始返回数据)
实际开发中从Firebase Database/Firestore拉取的数值列表,经常存在几类典型问题:列表本身可能为null、元素类型是通用的Any?、混合了Int/Long/Double等不同Number子类、存在null空元素、甚至有存储时类型写错的字符串格式数值。直接用标准库求和很容易触发空指针或者类型转换崩溃,推荐用兼容版的自定义扩展函数,不需要提前做列表类型清洗,直接适配原始返回的数据:
/** * 兼容Firebase原始数据的数值列表求和 * @return 有效元素累加结果,无有效元素时返回0.0 */ fun MutableList<*>?.calcFirebaseSum(): Double { this ?: return 0.0 var total = 0.0 for (item in this) { item ?: continue // 兼容所有Number子类(Int/Long/Double/Float) if (item is Number) { total += item.toDouble() } // 兼容字符串格式的数值残留 if (item is String) { runCatching { total += item.toDouble() } } } return total }
使用方式非常简单,不管从Firebase解析出的列表是啥结构,直接调用即可:
// 典型Firebase拉取的混合类型列表 val rawList = mutableListOf<Any?>(12.3, 5, null, 2.7, "10") val total = rawList.calcFirebaseSum() // 最终计算结果为 30.0
精度优化场景
如果是计算金额等对精度要求高的场景,避免Double累加带来的浮点误差,可以把累加逻辑替换为BigDecimal实现:
fun MutableList<*>?.calcFirebaseMoneySum(): BigDecimal { this ?: return BigDecimal.ZERO var total = BigDecimal.ZERO for (item in this) { item ?: continue when (item) { is Number -> total = total.add(BigDecimal.valueOf(item.toDouble())) is String -> runCatching { total = total.add(BigDecimal(item)) } } } return total }
内容的提问来源于stack exchange,提问作者Abugewa Zenith
相关产品推荐
相关产品推荐

