基本介绍
闭包:一个函数和与其相关的引用环境组合的一个整体(实体)。个人理解就是把最内层函数需要的参数包装起来,使得在外层函数出栈时参数还存在于堆中,从而得到内层函数所要的结果。
柯里化:把一个参数的多个参数,变成多个参数列表。
闭包代码理解
通过代码去理解scala中的闭包
package chapter02
object Test07_ClosureAndCurrying {
def main(args: Array[String]): Unit = {
def add(a: Int, b: Int): Int = {
a + b
}
println(add(2, 3))
def addByFour1(b: Int): Int = {
4 + b
}
def addByFive(b: Int): Int = {
5 + b
}
def addByFour3(): Int=>Int = {
val a = 4
def addB(b: Int): Int = {
a + b
}
addB
}
println(addByFour3()(5))
// 内层函数addB需要使用外层函数addA中的a参数,如果没有闭包,则当外层函数addByA运行完出栈后,参数a也会随之消失,
// 但这里内层函数还是addB还是能引用参数a,说明形成了闭包
def addByA(a: Int): Int=>Int = {
def addB(b: Int): Int = {
a + b
}
addB
}
println(addByA(21)(21))
// 逐渐简化,很离谱
// 1、返回值是一个函数,可以改为匿名函数,即不需要函数名、函数返回值
def addByA1(a: Int): Int=>Int = {
(b: Int) => {
a + b
}
}
// 2、b的返回值已经在addByA2中定义好了,所以可以省略
def addByA2(a: Int): Int=>Int = {
b => {
a + b
}
}
// 3、返回值只有一行,可以省略{}
def addByA3(a: Int): Int=>Int = {
b => a + b
}
// 4、如果参数在后面只出现一次,可以省略参数,直接使用下划线(_)代替
def addByA4(a: Int): Int=>Int = a + _
// 5、柯里化,推荐使用
def addCurrying(a: Int)(b: Int): Int = {
a + b
}
println(addCurrying(3)(4)) // 7
}
}
就是这么简单粗暴!!!