Scala混合了面向对象和函数式的特性,我们通常将可以作为参数传递到方法中的表达式叫做函数。在函数式编程语言中,函数是“头等公民”,高阶函数包含:作为值的函数、匿名函数、闭包、柯里化等等。
1、作为值的函数
可以像任何其他数据类型一样被传递和操作的函数。
定义函数时格式:val 变量名 = (输入参数类型和个数) => 函数实现和返回值类型
“=>”左面表示输入参数名称、类型和个数,右边表示函数的实现和返回值类型
object Test{
def main(args: Array[String]): Unit = {
val arr=Array(1,2,3,4,5)
//定义一个函数并将值赋给变量func1
val func1=(x:Int)=>x+5
//将函数作为参数传入arr的map方法中
val arr2=arr.map(func1)
println(arr2.toList)
}
}
2、匿名函数
在Scala中,不需要给每一个函数命名。我们把没有将函数赋给变量的函数叫做匿名函数。
val arr=Array(1,2,3,4,5)
//直接将匿名函数传入到map方法中,效果和前面一样
val arr2=arr.map((x:Int)=>x+5)
println(arr2.toString)
由于Scala可以自动推断出参数的类型,所以可以简写:
val arr2=arr.map(x=>x+5)
下划线模式:
val arr2=arr.map(_+5)
3、柯里化
柯里化(Currying)指的是把原来接受多个参数的函数变换成接受一个参数的函数过程,并且返回接受余下的参数且返回结果为一个新函数的技术。
柯里化(Currying)函数是一个带有多个参数,并引入到一个函数链中的函数,每个函数都使用一个参数。
scala柯里化风格的使用可以简化主函数的复杂度,提高主函数的自闭性,提高功能上的可扩张性、灵活性。可以编写出更加抽象,功能化和高效的函数式代码。
4、闭包
闭包是一个函数,返回值依赖于 声明在函数外部的一个或多个变量。
闭包通常来讲可以简单的认为是可以访问不在当前作用域范围内的一个函数。
val y=10
//变量y不处于其有效作用域时,函数还能够对变量进行访问
val add=(x:Int)=>{
x+y
}
//在add中有两个变量:x和y。其中的一个x是函数的形式参数,
//在add方法被调用时,x被赋予一个新的值。
// 然而,y不是形式参数,而是自由变量
println(add(5)) // 结果15