【大纲】
【正文】
1.【结论】函数语法
val 函数变量名 = (参数名: 参数类型, 参数名: 参数类型) => {函数体代码块}
# 说明:
0.函数变量名的数据类型是Function2,即,scala中的函数,是一个变量,是一个对象。所以函数,可以作为参数来传递。函数可作为方法和函数的参数、可作为方法的返回值
1.函数的参数类型可省略不写,会自动推断
2.=>符号 代表 转变成、计算成
3.函数无需指定返回值类型,会根据{函数体代码块}中具体返回什么值自动推断,如果没有返回值当然是返回Unit对象
4.函数的另一种语法:
val getSum:(Int => Int) = x => x + 1 ,其中,Int => Int是函数的数据类型
示例
# 定义函数
scala> val getSum = (x:Int, y:Int) => x + y
getSum: (Int, Int) => Int = <function2>
# 调用函数
scala> val a = getSum(1,2)
a: Int = 3
# 定义函数
scala> val min = (x:Int, y:Int) => {if (x < y) x else y}
min: (Int, Int) => Int = <function2>
# 调用函数
scala> val a = min(1,2)
a: Int = 1
2.【结论】匿名函数
(参数名: 参数类型, 参数名: 参数类型) => {函数体代码块}
示例
# 匿名函数
scala> (z:Int, y:Int) => z + y
res1: (Int, Int) => Int = <function2>
3.【结论】方法和函数的区别
0.java中,函数和方法是一个东西,只是叫法不同。scala中,方法同java的方法,函数是个变量(对象),可和变量一样进行参数与返回值的传递
1.方法隶属于类或对象,程序运行时,方法被加载到JVM的方法区,调用到方法时,方法对象会加载进栈内存
2.将函数对象赋值给一个变量,程序运行时,函数加载到JVM的堆内存
3.函数是一个对象,继承自FunctionN,函数对象有apply()、curried()、toString()、tupled(),而方法没有
4.scala中,函数是对象,方法可隶属于对象。说方法归属于函数,是对的
4.【结论】函数作为参数传递
示例
### 函数作为方法的参数传递
# 定义参数含函数的方法
scala> def addFunc(x:Int, f:(Int => Int)): Int = f(x) + 1
addFunc: (x: Int, f: Int => Int)Int
# 定义函数 将作为参数传递给方法
scala> val doubleX = (x:Int) => x + x
doubleX: Int => Int = <function1>
# 调用方法 函数作为参数传给方法
scala> val a = addFunc(5, doubleX)
a: Int = 11
### 函数作为函数的参数传递
# 定义函数bF
scala> val bF = (f:(Int => Int), x:Int) => f(x) + 1
bF: (Int => Int, Int) => Int = <function2>
# 定义函数aF,将作为函数bF的参数
scala> val aF = (x:Int) => x + x
aF: Int => Int = <function1>
# 调用函数bF
scala> val z = bF(aF, 5)
z: Int = 11
5.【结论】函数作为返回值
# 函数作为方法的返回值
# 定义方法 返回值是个函数
scala> def addF(x:Int, f:(Int, Int) => Int) = (a:Int, b:Int) => x + f(a, b)
addF: (x: Int, f: (Int, Int) => Int)(Int, Int) => Int
# 定义函数 作为参数传递给方法
val add = (x:Int, y:Int) => x + y
add: (Int, Int) => Int = <function2>
# 调用方法
scala> val z = addF(1, add)
z: (Int, Int) => Int = <function2> # 返回值z是个函数
# 调用z这个方法
scala> val res = z(5,6)
res: Int = 12
6.【结论】方法转函数
0.当方法作为参数时 会自动转化为函数
1.方法不能直接作为返回值,需手动将方法转为函数:
val 函数变量名 = 方法名 _
示例
### 当方法作为方法的参数时 会自动转化为函数
# 定义方法a 将作为方法b的参数
scala> def a(x:Int, y:Int) = x + y
a: (x: Int, y: Int)Int
# 定义方法b 参数含函数
scala> def b(f:(Int, Int) => Int, x:Int, y:Int) = f(x, y)
b: (f: (Int, Int) => Int, x: Int, y: Int)Int
# 调用方法b
scala> b(a, 1, 2) # 需要函数,传入了方法a,会自动转化为函数
res15: Int = 3
### 当方法作为方法的参数时 会自动转化为函数
# 定义方法a 将作为参数传递给函数
scala> def a(x:Int, y:Int) = x + y
a: (x: Int, y: Int)Int
# 定义函数b 参数含函数
scala> val b = (f:(Int, Int) => Int, x:Int, y:Int) => f(x, y)
b: ((Int, Int) => Int, Int, Int) => Int = <function3>
# 调用函数b
scala> b(a, 1, 2) # 需要函数,传入了方法a,会自动转化为函数
res16: Int = 3
### 方法不能直接作为返回值 需手动将方法转为函数
# 定义方法
scala> def sum(n:Int, m:Int) = n + m
sum: (n: Int, m: Int)Int
# 方法转函数sumS
scala> val sumS = sum _
sumS: (Int, Int) => Int = <function2>
# 定义方法addF 返回值是函数sumS
scala> def addF() = sumS
addF: ()(Int, Int) => Int
# 调用方法addF
scala> val a = addF # 返回值是函数sumS
a: (Int, Int) => Int = <function2>
# 调用a
scala> a(1,2)
res18: Int = 3