You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala中如何将Map转换为新Map并处理重复新键的聚合

解决Scala中Map按新键分组并聚合值的问题

你可以通过groupBy结合mapValues实现需求,或者用更高效的foldLeft直接遍历聚合:

方法1:groupBy + mapValues(直观易懂)

先用groupBy按新键分组,再对每个分组内的值执行聚合操作:

val oldMap = Map(2 -> 111, 3 -> 222, 4 -> 333)
// 按k%2生成新键,对同新键的值求和
val sumAggMap = oldMap.groupBy(_._1 % 2).mapValues(_.values.sum)
// 输出:Map(0 -> 444, 1 -> 222)

如果需要自定义聚合逻辑,只需替换sum为你的目标函数即可:

  • 拼接值为字符串示例:
val strAggMap = oldMap.groupBy(_._1 % 2).mapValues(_.values.mkString(","))
// 输出:Map(0 -> "111,333", 1 -> "222")
  • 取最大值示例:
val maxAggMap = oldMap.groupBy(_._1 % 2).mapValues(_.values.max)
// 输出:Map(0 -> 333, 1 -> 222)

方法2:foldLeft(更高效,避免中间嵌套Map)

直接遍历原Map的每个键值对,逐步构建聚合后的新Map:

val oldMap = Map(2 -> 111, 3 -> 222, 4 -> 333)
val sumAggMap = oldMap.foldLeft(Map.empty[Int, Int]) { case (acc, (k, v)) =>
  val newKey = k % 2
  // 累加值:新键已存在则加v,不存在则初始化为v
  acc.updated(newKey, acc.getOrElse(newKey, 0) + v)
}
// 输出:Map(0 -> 444, 1 -> 222)

这种方式适合复杂聚合场景,能更灵活地控制每一步的处理逻辑。

内容的提问来源于stack exchange,提问作者Parting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:39:57