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: groupBycase 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 mapValuespets.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: groupMappets.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 groupMapReducepets.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))