所谓的函数式编程指的是方法的参数列表可以接收函数对象。
在编写spark、flink时,常常会用到函数式编程。下面这些操作是学习的重点。
函数名 | 功能 |
---|---|
foreach | 用来遍历集合的,接受一个函数对象,函数的参数为集合的元素,返回值为空 |
map | 用来对集合进行转换的 |
flatMap | 用来对集合进行映射扁平化操作。扁平化操作可以理解为先map,然后flatten |
filter | 用来过滤出指定的元素 |
sorted | 用来对集合元素进行默认排序 |
sortBy | 用来对集合按照指定字段排序 |
sortWith | 用来对集合进行自定义规则排序 |
groupBy | 用来对集合元素按照指定条件分组,返回一个映射Map[K, List[A]],K为分组字段,List为这个分组字段对应的一组数据 |
reduce | 用来对集合元素进行聚合计算,最终得到一个聚合元素 |
fold | 用来对集合元素进行折叠计算,最后得到一个聚合元素。与reduce的不同时他提供了一个初始元素 |
实例:
// foreach
val lst = (1 to 10).toList
// 简写版:lst.foreach(println)
lst.foreach((x:Int) => {println(x)})
// 如果函数参数只在函数体中出现一次,并且函数体没有涉及到复杂的使用,此时就可以使用下划线(_)的方式来优化函数定义
// map, map[返回类型](f: (A) => B)
// val lst2 = lst1.map(x => "*" * x)
val lst2 = lst1.map((x:Int) => {"*" * x})
// flatMap
val lst3 = List("PHP is Best in the world", "fuck C++")
val lst4 = lst3.flatMap(x => x.split(" "))
// 相当于 lst3.map(x => x.split(" ")).flatten
// filter
val lst5 = (1 to 10).toList
val lst6 = lst5.filter(_%2 == 0)
// sorted
val lst7 = List(3, 1, 2, 9, 7)
val lst8 = lst7.sorted
// 降序排序,reverse逆转即可
val lst9 = lst8.reverse
// sortBy
val lst10 = List("1-php", "3-python", "2-scala")
val lst11 = sortBy(x => x.split("-")(0))
// sortWith,降序排列
val lst12 = lst7.sortWith( (x1, x2) => x1>=x2)
// groupBy
val lst13 = List("Jack"->"male", "Lucy"->"female", "Mike"->"male")
val map1 = lst13.groupBy(x => x._2) // Map("male"->List("Jack", "Mike"), "female" => List("Lucy")
// 统计每个组中元素的个数
val map2 = map1.map(x => x._1 -> x._2.size) // Map("female"->1, "male"->2)
// 聚合操作
// reduce, x表示聚合后的结果,y表示后一个元素
val lst14 = lst7.reduce((x, y) => x+y) // 将列表的数相加
// reduceRight
val lst15 = lst7.reduceRight((x, y) => x-y)
val lst16 = lst8.reduceLeft((x,y) => x-y)
// fold, foldRight, foldLeft
val lst17 = List(1, 2, 3)
val lst18 = lst17.fold(10)((x, y) => x+y) // 16
网友评论