Scala中按键分组求和后如何返回List[InputRecord]而非元组列表
Scala分组求和返回指定样例类类型实现方案
错误原因
你之前的代码执行后得到的是Map[String, Long]类型的分组结果,调用toList后自然返回List[(String, Long)]类型的元组列表,和List[InputRecord]类型完全不匹配。
你尝试用asInstanceOf强转属于错误操作:该方法是不安全的运行期类型转换,你将集合类型强制转换为单个样例类类型,类型不兼容必然抛出类转换异常。
修复代码
你只需要在分组求和完成后,将得到的(费用描述, 总金额)元组手动映射为InputRecord实例即可:
case class InputRecord(FeeDescription: String, FeeAmount: Long) val reconInput : List[InputRecord] = List( InputRecord("Visa Auth Fee", 30), InputRecord("Visa Auth Fee", 40), InputRecord("Master Network Fee", 50) ) val output: List[InputRecord] = reconInput .groupBy(_.FeeDescription) .mapValues(_.foldLeft(0L)(_ + _.FeeAmount)) .map { case (feeDesc, totalAmount) => InputRecord(feeDesc, totalAmount) } .toList
执行结果
运行后得到的output值完全符合预期:
List(InputRecord("Visa Auth Fee", 70), InputRecord("Master Network Fee", 50))
优化建议
如果数据量较大,可以在groupBy之后加.view方法,可以避免生成中间Map集合,提升性能:
val output: List[InputRecord] = reconInput .groupBy(_.FeeDescription) .view .mapValues(_.foldLeft(0L)(_ + _.FeeAmount)) .map { case (feeDesc, totalAmount) => InputRecord(feeDesc, totalAmount) } .toList
内容的提问来源于stack exchange,提问作者Sekar Ramu
相关产品推荐
相关产品推荐

