Scala中如何计算列表元素price与quantity乘积的总和?
在Scala中计算列表元素price与quantity乘积之和的实现思路
嘿,这个需求在Scala里其实有好几种简洁又实用的实现方式,咱先明确个前提:假设你的列表元素是一个定义好的样例类(Case Class),比如这样:
case class ServItem(price: Double, quantity: Int) val lPserv: List[ServItem] = List(ServItem(15.99, 3), ServItem(9.99, 5))
下面给你梳理几个常用的实现思路:
最简洁直观:
map+sum组合
先通过map把每个元素转换成price * quantity的结果,再直接调用sum方法求和,代码非常清爽:// 常规写法 val total = lPserv.map(item => item.price * item.quantity).sum // 更简洁的下划线简写 val total = lPserv.map(_.price * _.quantity).sum这种写法适合逻辑简单的场景,可读性拉满,新手也能一眼看懂。
灵活可控:
foldLeft累加
如果你需要在累加过程中做额外的逻辑(比如过滤无效值、记录中间结果),foldLeft会是更好的选择。它从一个初始值开始,逐步迭代列表元素并更新累加值:val total = lPserv.foldLeft(0.0) { (accumulator, currentItem) => accumulator + currentItem.price * currentItem.quantity }这里初始值用
0.0是为了匹配Double类型的乘积结果,避免类型不兼容的问题。风格备选:for推导式
如果你更习惯for循环的写法,也可以用for推导式先生成乘积列表,再求和:val total = (for (item <- lPserv) yield item.price * item.quantity).sum本质上和
map+sum是一样的,只是写法风格不同,看个人偏好。
额外注意事项
如果你的price或quantity字段可能为空(比如用Option类型包装),那需要先处理空值情况,比如用getOrElse给默认值:
// 假设price是Option[Double] case class ServItem(price: Option[Double], quantity: Int) val total = lPserv.map(item => item.price.getOrElse(0.0) * item.quantity).sum
内容的提问来源于stack exchange,提问作者Jose Cabrera Zuniga
相关产品推荐
相关产品推荐

