Scala 是一门函数式的编程语言,同时兼顾了面向对象语言的特性。在Scala中,函数与方法时两个不同的概念。
- 方法与函数的定义方式不同
- 方法可以转换为函数
- 函数就是对象
- 函数可以作为方法的参数
- 函数可以作为方法的返回值
方法
声明方式
def methodName (参数名:参数类型, 参数名:参数类型) : [返回值类型] = {
// 方法体
}
函数
声明方式
val 函数名 = (参数名:参数类型, 参数名:参数类型) => { 函数体 }
val 函数名 : (参数类型, 参数类型) => (返回值) = { 函数体 }
方法转换为函数:
在某些情况下,需要将方法作为变量传递,这时就需要将方法转换为函数
def add (i:Int, j:Int) = i + j
val functionAdd = add _
print(functionAdd(1, 4))
函数与方法的区别:
- 方法隶属于类或者对象,在运行时,方法会加载到 jvm 的方法区中;函数是一个对象,在运行时,会被加载到 jvm 的堆内存中。
- 函数是一个对象,继承自 FunctionN,函数对象中有 apply()、curried()、toString()、tupled()这些方法,而方法则没有。
高阶函数
使用函数值作为参数,或者返回值为函数值的 “函数” 和 “方法”,均称之为 “高阶函数”。
1、函数作为参数
val array=Array(1,2,3,4,5)
val func=(x:Int)=>x*10
array.map(func)
2、匿名函数
val array=Array(1,2,3,4,5)
array.map(x=>x*10)
其中 “x=>x10” 部分即为声明的匿名函数,完整形式为:(x:Int)=>{x10}。
3、柯里化
方法可以定义多个参数列表,当使用较少的参数调用多参数列表的方法时,会产生一个新的函数,该函数接受剩余的参数列表作为其参数,这就被称为柯里化。简单理解就是将函数值作为方法的返回值。
// 返回值为 “(String, String) => String” 的函数
def method(a:String):(String,String)=>String={
(b:String,c:String)=>a+"-"+b+"-"+c
}
// 调用后返回匿名函数 (b:String,c:String)=>"str"+"-"+b+"-"+c
method("str")
// 比较简洁的定义方式
def getAddress(a:String)(b:String,c:String):String={
a+"-"+b+"-"+c
}