目录
1.Scala中的函数
2.匿名函数:没有名字的函数
3.带函数参数的函数,即:高阶函数
4.高阶函数示例
5.闭包
6.柯里化:Currying
1.Scala中的函数
在Scala中,函数是“头等公民”,就和数字一样。可以在变量中存放函数,即:将函数作为变量的值(值函数)
举例:使用Spark来执行WordCount
var result = sc.textFile("hdfs://....").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
2.匿名函数:没有名字的函数
//普通函数
def fun1(x:Int):Int = x*3
//匿名函数
(x:Int)=>x*3
注:匿名函数:一个普通的函数,把返回值去掉,再把函数名和“def”去掉,再在"="后面的加一个">"
调用匿名函数作为函数参数
3.带函数参数的函数,即:高阶函数
(1)示例1:
(a)首先,定义一个最普通的函数
(b)再定义一个高阶函数
(c)分析这个高阶函数调用的过程
(2)示例2:
在这个例子中,首先定义了一个普通的函数mytest,然后定义了一个高阶函数myFunction;myFunction接收三个参数:第一个f是一个函数参数,第二个是x,第三个是y。而f是一个函数参数,本身接收两个Int的参数,返回一个Int的值。
4.高阶函数示例
(1)map:相当于一个循环,对某个集合中的每个元素进行操作(接收一个函数),返回一个新的集合
//map
//在列表中的每个元素上计算一个函数,并且返回一个包含相同数目元素的列表
val numbers = List(1,2,3,4,5,6,7,8,9,10)
numbers.map((i:Int)=>i*2)
numbers.map(_*2)
//map函数不改变numbers值
numbers
_ 相当于循环变量 i
_*2 与 (i:Int)=>i*2 功能相同
_+_ 与 (i:Int,j:Int)=>i+j
(2)foreach:相当于一个循环,对某个集合中的每个元素进行操作(接收一个函数),不返回结果。
//foreach
//foreach和map相似,只不过它没有返回值,foreach主要是为了对参数进行作用
numbers.foreach((i:Int) => i * 2)
numbers.foreach(_*2)
numbers
numbers.foreach(println(_))
numbers.map(_*2).foreach(println)
(3)filter:过滤,选择满足的数据
举例:查询能够被2整除的数字
//filter
//移除任何使得传入的函数返回false的元素
numbers.filter((i:Int) =>i%2==0)
说明:(i:Int)=>i%2==0 如果是true 就返回
(4)zip:合并两个集合
//zip
//zip把两个列表的原色合成一个由元素对组成的列表
List(1,2,3).zip(List(4,5,6))
List(1,2,3).zip(List(4,5))
List(3).zip(List(4,5))
(5)partition:根据断言(就是某个条件,可以通过一个匿名函数来实现)的结果,进行分区
举例:把能够被2整除的分成一个区,不能整除的分成另一个区
//partition
//partition根据断言函数的返回值对列表进行拆分
numbers.partition((i:Int)=>i%2==0)
在这个例子中,可以被2整除的被分到一个分区;不能被2整除的被分到另一个分区。
(6)find:查找第一个满足条件(断言)的元素
//find
//find返回集合里第一个匹配断言函数的元素
numbers.find(_ % 3==0)
(7)flatten:把嵌套的结果展开,合并成为一个集合
//flatten
//flatten可以把嵌套的结构展开
List(List(1,2,3),List(4,5,6)).flatten
(8)flatmap:相当于map+flatten
//flatMap
//flatMap是一个常用的combinator,它结合了map和flatten的功能
val myList = List(List(2,4,6,8,10),List(1,3,5,7,9))
myList.flatMap(x=>x.map(_*2))
执行过程:
1.将List(2,4,6,8,10)和List(1,3,5,7,9)调用了x=>x.map(_*2) 这里x代表某个List
List(4, 8, 12, 16, 20) 和 List(2, 6, 10, 14, 18)
2.合并成一个List
List(4, 8, 12, 16, 20, 2, 6, 10, 14, 18)
5.闭包
就是函数的嵌套,即:在一个函数定义中,包含另外一个函数的定义;并且在内函数中可以访问外函数中的变量
测试上面的函数:
6.柯里化:Currying
柯里化函数(Curried Function)是把具有多个参数的函数转换为一条函数链,每个节点上是单一参数。
一个简单的例子: