Scala 的几种group集合操作
scala的集合中有如下几种group操作
groupBy
按特定条件对集合元素进行分类grouped
将集合拆分成指定长度的子集合groupMap
使用方法按特定条件对集合的元素进行分类并处理每个元素groupMapReduce
使用方法按特定条件对集合中的元素进行分类,分别进行处理,最后将它们reduce
这些方法在scala.collection.IterableOps中定义
groupBy
1 | def groupBy[K](f: (A) => K): immutable.Map[K, C] |
返回immutable Map,每个Map由一个键和一个原始类型的值的集合组成
为了在生成的Map中处理这个值的集合,Scala提供了mapValues方法
1 | def mapValues[W](f: (V) => W): Map[K, W] |
这个groupBy / mapValues组合对于处理从分组生成的Map的值非常方便
但是从Scala 2.13开始,方法mapValues不再可用
1 | // Example: groupBy |
groupBy / mapValues组合
1 | // Example: groupBy and mapValues |
groupMap
出现了一种新方法groupMap,按特定条件对集合的元素进行分类并处理每个元素
1 | def groupMap[K, B](key: (A) => K)(f: (A) => B): immutable.Map[K, CC[B]] |
对比上面的mapValues方法1
2
3
4
5
6
7// Example: groupMap
pets.groupMap(_.species)(_.name)
// val res8: scala.collection.immutable.Map[String,List[String]] = Map(
// cat -> List(sassy, bella),
// bird -> List(coco, kiwi),
// dog -> List(poppy, bodie, poppy))
groupMapReduce
有时,我们需要在对集合进行分组后对Map值进行reduce
1 | def groupMapReduce[K, B](key: (A) => K)(f: (A) => B)(reduce: (B, B) => B): immutable.Map[K, B] |
1 | // Example groupMapReduce |
grouped
集合拆分成指定长度的子集合
1 | def grouped(size: Int): Iterator[C] |
尝试将一个长度为9的集合进行切分
1 | val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9) |