Scala系列10:函数式编程groupBy与排序sorted详解

2020-09-28 19:19发布

0.Scala函数式编程

我们将来使用Spark/Flink的大量业务代码都会使用到函数式编程。下面这些事开发中常用的函数式编程。注意这些函数都是操作 Scala 集合的,一般会进行两类操作:转换操作(transformation )和行动操作(actions)(有些人喜欢叫他为聚合操作)。第一种操作类型将集合转换为另一个集合,第二种操作类型返回某些类型的值。

  1. 遍历( foreach )

  2. 映射( map )

  3. 映射扁平化( flatmap )

  4. 过滤( filter )

  5. 是否存在( exists )

  6. 排序( sorted 、 sortBy 、 sortWith )

  7. 分组( groupBy )

  8. 聚合计算( reduce )

  9. 折叠( fold )

1.groupBy分组的使用详解

【1.1 语法结构】

【1.2 groupBy流程展示】

【1.3 代码演示】

  1. scala> val a = List("张三"->"男", "李四"->"女", "王五"->"男")

  2. a: List[(String, String)] = List((张三,男), (李四,女), (王五,男))

  3. // 按照性别分组

  4. scala> a.groupBy(_._2) //._2这是元组的取数方法,表示取元组的第二个元素

  5. res0: scala.collection.immutable.Map[String,List[(String, String)]] = Map(男 -> List((

  6. 张三,男), (王五,男)),

  7. 女 -> List((李四,女)))

  8. 87

  9. // 将分组后的映射转换为性别/人数元组列表

  10. scala> res0.map(x => x._1 -> x._2.size)

  11. res3: scala.collection.immutable.Map[String,Int] = Map(男 -> 2, 女 -> 1)

尖叫提示:

其实分组中还可以用partition,功能跟groupBy差不多,但是注意其返回值不一样。最终的格式也不一应。

  1. scala> val numbers = Seq(3, 7, 2, 9, 6, 5, 1, 4, 2)

  2. numbers: Seq[Int] = List(3, 7, 2, 9, 6, 5, 1, 4, 2)


  3. scala> numbers.partition(n => n % 2 == 0)

  4. res32: (Seq[Int], Seq[Int]) = (List(2, 6, 4, 2),List(3, 7, 9, 5, 1))


  5. scala> numbers.groupBy(n => n % 2 == 0)

  6. res33: scala.collection.immutable.Map[Boolean,Seq[Int]] = Map(false -> List(3, 7, 9, 5, 1), true -> List(2, 6, 4, 2))

2.排序sorted使用详解

在scala集合中,可以使用以下几种方式来进行排序

  1. sorted默认排序

  2. sortBy指定字段排序

  3. sortWith自定义排序

2.1默认排序sorted

  1. scala> List(3,1,2,9,7).sorted

  2. res16: List[Int] = List(1, 2, 3, 7, 9)

2.2指定字段排序 | sortBy

def sortBy[B](f: (A) ⇒ B): List[A]


  1. scala> val a = List("01 hadoop", "02 flume", "03 hive", "04 spark")

  2. a: List[String] = List(01 hadoop, 02 flume, 03 hive, 04 spark)

  3. // 获取单词字段

  4. scala> a.sortBy(_.split(" ")(1))

  5. res8: List[String] = List(02 flume, 01 hadoop, 03 hive, 04 spark)

2.3 自定义排序 | sortWith

自定义排序,根据一个函数来进行自定义排序

def sortWith(lt: (A, A) ⇒ Boolean): List[A]

【代码演示】 

  1. //基础函数

  2. scala> val a = List(2,3,1,6,4,5)

  3. a: List[Int] = List(2, 3, 1, 6, 4, 5)


  4. scala> a.sortWith((x,y) => if(x<y)true else false)

  5. res15: List[Int] = List(1, 2, 3, 4, 5, 6)


  6. scala> res15.reverse

  7. res18: List[Int] = List(6, 5, 4, 3, 2, 1)


  8. //简化函数

  9. scala> val a = List(2,3,1,6,4,5)

  10. a: List[Int] = List(2, 3, 1, 6, 4, 5)


  11. // 函数参数只在函数中出现一次,可以使用下划线代替

  12. scala> a.sortWith(_ < _).reverse

  13. res19: List[Int] = List(6, 5, 4, 3, 2, 1)

作者:涤生手记

链接:https://blog.csdn.net/qq_26442553/article/details/108365803

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。