Scala被认为是函数式编程语言,故Scala函数是Scala编程的核心。所以掌握scala的函数至关重要。
本章要点
- 命名参数的函数
- 可变参数的函数
- 递归函数
- 默认参数值函数
- 高阶函数
- 嵌套函数
- 匿名函数
- 部分应用函数
- 柯里化函数
3.1 带名参数
在正常的函数调用中,调用的参数按照被调用函数定义的参数顺序逐个匹配。命名参数允许您以不同的顺序将参数传递给函数。语法只是每个参数前面都有一个参数名称和一个等号。
函数定义
def printInt( a:Int, b:Int ) = {
println("Value of a : " + a );
println("Value of b : " + b );
}
调用的时候
3.2 可变参数
和java一样,Scala允许指定函数的最后一个参数可重复。 这允许客户端将可变长度参数列表传递给函数。 这里参数类型实际上是Array 。
例子:
def sum( arrays :Int * ) = {
var sum:Int=0;
for(a<-arrays){
sum+=a;
}
sum
}
调用
sum(1,2,3)
3.3 递归函数
Scala支持递归函数。 递归表示一个函数可以重复调用自身。
def digui(i:Int):Int={
if(i<=0){
1
}else{
i*digui(i-1)
}
}
3.4 默认参数值函数
- 默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值。
- 如果不想覆盖默认值,传入的参数个数小于定义的函数的参数,则需要指定参数名称。
def fun3(a :Int = 10,b:Int) = {
println(a+b)
}
调用
fun3(b=2)
3.5 高阶函数
函数的参数是函数,或者函数的返回类型是函数,或者函数的参数和函数的返回类型是函数的函数。
- 函数的参数是函数
- 函数的返回是函数
- 函数的参数和函数的返回是函数
函数定义
def hello(info:String):String={
"hello "+info
}
def byebye(info:String):String={
"byebye "+info
}
def highfuc(fuc:(String)=> String,info:String )={
fuc(info)
}
函数调用:
println(highfuc(hello, "zhaoshichao"))
println(highfuc(byebye, "zhaoshichao"))
执行的结果是
3.6 嵌套函数
Scala允许您定义函数内部的函数,而在其他函数中定义的函数称为局部函数。这是一个阶乘计算器的实现,我们使用传统的技术来调用第二个嵌套方法来完成工作。
def jiecheng(i: Int): Int = {
def qiantao(i: Int, accumulator: Int): Int = {
if (i <= 1){
accumulator
}else{
qiantao(i - 1, i * accumulator)
}
}
qiantao(i, 1)
}
3.7 匿名函数
Scala提供了一个相对轻量级的语法来定义匿名函数。源代码中的匿名函数称为函数文字,在运行时,函数文字被实例化为称为函数值的对象。
//有参数匿名函数
val value1 = (a : Int) => {
println(a)
}
value1(1)
//无参数匿名函数
val value2 = ()=>{
println("我爱尚学堂")
}
value2()
//有返回值的匿名函数
val value3 = (a:Int,b:Int) =>{
a+b
}
println(value3(4,4))
注意
- 可以将匿名函数返回给val定义的值
- 匿名函数不能显式声明函数的返回类型
3.8 偏应用函数
当在调用一个函数时, 如果您传递所有预期的参数,则表示您已完全应用它。 如果只传递几个参数并不是全部参数,那么将返回偏应用的函数。这样就可以方便地绑定一些参数,其余的参数可稍后填写补上。
例子:
/**
* 偏应用函数
*/
def log(date :Date, s :String)= {
println("date is "+ date +",log is "+ s)
}
val date = new Date()
log(date ,"log1")
log(date ,"log2")
log(date ,"log3")
//想要调用log,以上变化的是第二个参数,可以用偏应用函数处理
val logWithDate = log(date,_:String)
logWithDate("log11")
logWithDate("log22")
logWithDate("log33")
3.9 柯里化函数
柯里化(Currying)函数是一个带有多个参数,并引入到一个函数链中的函数,每个函数都使用一个参数。 柯里化(Currying)函数用多个参数表定义,如下所示:
/**
* 柯里化函数
*/
def fun7(a :Int,b:Int)(c:Int,d:Int) = {
a+b+c+d
}
println(fun7(1,2)(3,4))//调用
柯里化(Currying)函数可以理解为高阶函数的简化