Scala 的几种 group 汇合操作
scala 的汇合中有如下几种 group 操作
groupBy
按特定条件对汇合元素进行分类grouped
将汇合拆分成指定长度的子集合groupMap
应用办法按特定条件对汇合的元素进行分类并解决每个元素groupMapReduce
应用办法按特定条件对汇合中的元素进行分类,别离进行解决,最初将它们 reduce
这些办法在 scala.collection.IterableOps 中定义
groupBy
def groupBy[K](f: (A) => K): immutable.Map[K, C]
返回 immutable Map,每个 Map 由一个键和一个原始类型的值的汇合组成
为了在生成的 Map 中解决这个值的汇合,Scala 提供了 mapValues 办法
def mapValues[W](f: (V) => W): Map[K, W]
这个 groupBy / mapValues 组合对于解决从分组生成的 Map 的值十分不便
然而从 Scala 2.13 开始,办法 mapValues 不再可用
// Example: groupBy
case class Pet(species: String, name: String, age: Int)
val pets = List(Pet("cat", "sassy", 2), Pet("cat", "bella", 3),
Pet("dog", "poppy", 3), Pet("dog", "bodie", 4), Pet("dog", "poppy", 2),
Pet("bird", "coco", 2), Pet("bird", "kiwi", 1)
)
pets.groupBy(_.species)
// res5: scala.collection.immutable.Map[String,List[Pet]] = HashMap(// bird -> List(Pet(bird,coco,2), Pet(bird,kiwi,1)),
// dog -> List(Pet(dog,poppy,3), Pet(dog,bodie,4), Pet(dog,poppy,2)),
// cat -> List(Pet(cat,sassy,2), Pet(cat,bella,3)))
groupBy / mapValues 组合
// Example: groupBy and mapValues
pets.groupBy(_.species).mapValues(_.map(_.name)).toMap
// warning: method mapValues in trait MapOps is deprecated (since 2.13.0): Use .view.mapValues(f). A future // // version will include a strict version of this method (for now, .view.mapValues(f).toMap).
// val res7: scala.collection.immutable.Map[String,List[String]] = Map(// bird -> List(coco, kiwi),
// dog -> List(poppy, bodie, poppy),
// cat -> List(sassy, bella))
groupMap
呈现了一种新办法 groupMap,按特定条件对汇合的元素进行分类并解决每个元素
def groupMap[K, B](key: (A) => K)(f: (A) => B): immutable.Map[K, CC[B]]
比照下面的 mapValues 办法
// 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
def groupMapReduce[K, B](key: (A) => K)(f: (A) => B)(reduce: (B, B) => B): immutable.Map[K, B]
// Example groupMapReduce
pets.groupMapReduce(_.species)(_ => 1)(_ + _)
//val res9: scala.collection.immutable.Map[String,Int] = Map(
// cat -> 2,
// bird -> 2,
// dog -> 3)
grouped
汇合拆分成指定长度的子集合
def grouped(size: Int): Iterator[C]
尝试将一个长度为 9 的汇合进行切分
val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
list.grouped(4).toList
// val res11: List[List[Int]] = List(List(1, 2, 3, 4), List(5, 6, 7, 8), List(9))