1.普通函数,scala函数不明显使用return返回值,如果有返回值,最后一行就是返回值
1.1定义返回值为Int的函数
def fun(x:Int,y:Int) : Int = {
x+y//返回x+y的结果
}
等价函数:
def fun(x:Int,y:Int) = {//不写返回值类型scala会自动匹配最后一行的输出结果类型作为返回值类型
x+y//返回x+y的结果
}
1.2无返回值函数
//如果没有返回值可以省略冒号、返回值类型、等号;定义没有返回值的函数(返回值为Unit)
def fun(x:String,y:String){
println(x + "-" + y)
}
相当于
def fun(x:Int,y:Int) : Unit={
println(x + "-" + y)
}
1.3定义带有初始值参数的函数
def fun(x:Int=10) = {
x + 5
}
注意:调用有参数的函数必须在函数名后加()
调用带有初始值参数的函数,传入的参数会覆盖参数初始值
2.值函数
说明:函数体赋给一个变量,调用的时候直接使用变量的名称
val valueFunction = (x:Int)=>x+1
调用:valueFunction(20)
相当于如下函数的定义:
def valueFunction(x:Int) : Int = x+1
多个语句的值函数
dec valueMultiFunction(x:Int) {
var b = x+2
println("b" + b)
}
3.匿名函数
val str1 = Array(1,2,3,4).map((x:Int)=>x+1).mkString(",")
//参数类型推倒
val str2 = Array(1,2,3,4).map((x)=>x+1).mkString(",")
//函数只有一个参数的话,可以省略()
val str3 = Array(1,2,3,4).map(x=>x+1).mkString(",")
////如果参数右边只出现一次,则可以进一步简化
val str4 = Array(1,2,3,4).map(_+1).mkString(",")
4.高阶函数
4.1函数参数
= 左边定义函数的参数 ,规定传入的“函数”参数类型,= 右边调用传入的“函数”并给一个参数值,这个参数值的类型就是定义的传入“函数”参数的“参数”类型如f:(Int)为Int型(太绕嘴了)
定义:def paramFunction(f:(Int)=>String)=f(10)
说明:f:(Int)=>String定义传入的“函数”参数,这个函数的输入参数为Int型,返回值为String类型
调用:paramFunction((x:Int)=>"Hello " + x)
4.2调用函数产生一个新的函数(函数返回值为函数)
定义:def productNewFunction(y:Int)=(x:Int)=>x * y
说明:(大白话表达)相当于一个函数里定义了一个匿名函数,把最外层函数的参数赋给函数体内的匿名函数,匿名函数有自己的参数,当调用外层函数的时候返回一个中间函数,当再次调用中间函数的时候才会返回数据结果。
演示:
5.函数闭包
定义:
var freeParam=10
def closeFun(x:Int)=x + freeParam
说明:
x:绑定变量,x的类型在定义函数的时候就已经定义好了,x的值在函数调用的时候确定
freeParam:自由变量,在定义函数之前类型不固定,freeParam值可以不断的变化,freeParam值影响到整个函数的结果。注意:freeParam变量必须在闭包函数定义之前定义,否则报错
调用:
关于闭包(大白话):freeParam变量的类型和值在运行的时候确定,而且freeParam的值可以不断的变化并且影响整个函数的结果,这种由自由式变为封闭式的过程就是闭包