目录
函数式编程
函数式编程指定就是方法的参数列表可以接收函数对象
例如:add(10,20)就不是函数式编程,而add(函数对象)这种格式就叫做函数式编程
我们将来编写Spark/Flink的大量业务代码的时候,都会使用到函数式编程
函数名 | 功能 |
---|---|
foreach | 用来遍历集合的 |
map | 用来对集合进行转换的 |
flatmap | 用来对集合进行映射扁平化操作的 |
filter | 用来过滤出指定元素 |
sorted | 用来对集合元素进行默认排序 |
sortBy | 用来对集合按照指定字段排序 |
sortwith | 用来对集合进行自定义排序 |
groupby | 用来对集合元素按照指定条件进行分组 |
reduce | 用来对集合元素进行聚合运算 |
fold | 用来对集合元素进行折叠计算 |
案例一:遍历(foreach)
采用foreach来遍历集合,可以让代码看起来更简洁优雅
格式
def foreach(f:(A)=>Unit):Unit //括号函数体 //简写形式 def foreach(函数)
说明
foreach | API | 说明 |
---|---|---|
参数 | f:(A)=>Unit | 接收一个函数对象,函数的参数为集合的元素,返回值为空 |
返回值 | Unit | 表示foreach函数的返回值为:空 |
package test object Demo17 { def main(args: Array[String]): Unit = { //1.有一个列表包含以下元素1,2,3,4 val list1=List(1,2,3,4) //2.使用foreach方法来遍历打印每个元素 list1.foreach((x:Int)=>{println(x)}) //Int跟小括号可以省略 //函数格式: (函数的参数列表)=> {函数体} x表示列表中的每一个元素 } }
案例二:简化函数定义
上述定义有点啰嗦,有更简洁的写法,可以通过如下两种方式来简化函数定义:
方式一:通过类型推断来简化函数定义
解释:因为使用foreach来迭代列表,而列表中的每个元素类型都属确定的,所以我们可以通过类型推断让scala程序自动推断出来集合中每个元素参数类型即:在我们创建函数时,可以省略其参数列表的类型
方式二:通过下划线来简化函数定义
解释:当函数参数,只在函数体中出现一次,而且函数体没有嵌套调用时,可以使用下划线来简化函数定义
案例:
package test object Demo17 { def main(args: Array[String]): Unit = { //1.有一个列表,包含元素1,2,3,4,5请使用foreach的方法遍历打印每一个元素 val list1=List(1,2,3,4) //普通写法 list1.foreach((x:Int)=>{println(x)}) println("-"*20) //2.使用类型推断来简化函数定义 list1.foreach(x=>println(x)) println("-"*20) //3.使用下划线来简化函数定义 如果函数参数只在函数体中出现一次并且函数体未出现复杂应用嵌套之类的 list1.foreach(println(_)) } }
案例三:映射
映射就是指将一种数据类型转化为另一种数据类型的过程,它是在进行数据计算的时候,甚至将来在编写Spark/Flink程序时用得最多的操作,也是我们必须要掌握的
格式
def map[B](f:(A)=>B): TraversableOnce[B] //简写形式 def map(函数对象)
说明
map方法 | API | 说明 |
---|---|---|
泛型 | [B] | 指定map方法最终返回的集合泛型,可省略不写 |
参数 | f:(A)=>B | 函数对象,参数列表为类型A(要转换的列表元素),返回值为类型B |
返回值 | TraversableOnce[B] | B类型的集合,可省略不写 |
package test object Demo17 { def main(args: Array[String]): Unit = { //创建一个列表包含元素:1,2,3,4 val list1=List(1,2,3,4) //将上述数字转换成对应个数的*,即:1变为*,2变为**,以此类推 val list2=list1.map((x:Int)=>{"*" * x})//普通写法 println(s"list2:${list2}") //类型推断 val list3=list1.map(x=>"*"*x) println(s"list3:${list3}") //下划线 val list4=list1.map(("*"*_)) println(s"list4:${list4}") } }