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) } }
关键适配说明
- 替换
TraversableLike为Iterable:Scala 2.13以Iterable作为所有可遍历集合的基础特质,覆盖了List、Set等常用类型,实现统一处理。 - 用
BuildFrom替代CanBuildFrom:BuildFrom是2.13中集合构建的标准隐式机制,会自动匹配原集合类型生成对应的目标集合(比如从Set[(K,V)]生成Set[V])。 - 用
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
相关产品推荐
相关产品推荐

