Scala 的几种group集合操作

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))
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值