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
相关产品推荐
相关产品推荐

