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

Scala 2.13迁移:如何实现通用(K,V)集合的groupByKey方法

Scala 2.13 移植按键分组的隐式类实现

针对你从Scala 2.12升级到2.13时遇到的TraversableLike移除问题,以下是适配后的代码实现,可支持Set[(K, V)]和List[(K, V)]按键分组并保留原集合类型:

import scala.collection.BuildFrom

implicit class IterableGroupingOps[K, V, R[A] <: Iterable[A]](val tuples: R[(K, V)]) extends AnyVal {
  def groupPairsByFirstElement(implicit bf: BuildFrom[R[(K, V)], V, R[V]]): Map[K, R[V]] = {
    tuples.groupMap(_._1)(_._2)
  }
}

关键适配说明

  1. 替换TraversableLike为Iterable:Scala 2.13以Iterable作为所有可遍历集合的基础特质,覆盖了List、Set等常用类型,实现统一处理。
  2. 用BuildFrom替代CanBuildFrom:BuildFrom是2.13中集合构建的标准隐式机制,会自动匹配原集合类型生成对应的目标集合(比如从Set[(K,V)]生成Set[V])。
  3. 用groupMap简化逻辑:2.13新增的groupMap方法直接完成「分组+映射值」的操作,替代原代码的groupBy+mapValuesStrict,既避免了视图延迟计算,又让代码更简洁。

使用示例

  • List类型分组:
val listPairs = List(("a", 1), ("b", 2), ("a", 3))
val groupedList = listPairs.groupPairsByFirstElement
// 结果:Map("a" -> List(1, 3), "b" -> List(2))
  • Set类型分组:
val setPairs = Set(("a", 1), ("b", 2), ("a", 3))
val groupedSet = setPairs.groupPairsByFirstElement
// 结果:Map("a" -> Set(1, 3), "b" -> Set(2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:13:22