14.7 闭包
闭包是函数式编程中的一个比较重要的概念.
很多时候你没有意识到他的存在, 但是他确确实实在为我们工作.
14.7.1 什么是闭包
闭包就是一个函数和与其相关的引用环境(变量)组合的一个整体(实体)
// 这个函数就会返回一个闭包
def foo():()=>Int = {
var a = 10
() => a += 10; a // 返回值为这个闭包
}
14.7.2 使用闭包
object ClosureDemo1 {
def main(args: Array[String]): Unit = {
// 获取一个闭包
val f1 = foo()
println(f1())
println(f1())
// 又一闭包. 每个闭包都有自己的环境的值, 所以这个闭包的a又从10开始了
val f2 = foo()
println(f2())
println(f2())
}
def foo() = {
var a = 10
() => a += 10; a
}
}
14.7.3 闭包最佳实践
需求:
编写一个函数
makeSuffix(suffix: String)
可以接收一个文件后缀名(比如.jpg),并返回一个闭包调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg) ,则返回 文件名.jpg , 如果已经有.jpg后缀,则返回原文件名。
要求使用闭包的方式完成
package com.atguigu.day12
object ClosureDemo2 {
def main(args: Array[String]): Unit = {
val fun: String => String = makeSuffix("avi")
println(fun("hadoop视频"))
println(fun("scala视频"))
println(fun("苍老师视频.avi"))
}
def makeSuffix(suffix: String): String => String = {
fileName => if (fileName.endsWith(suffix)) fileName else fileName + "." + suffix
}
}
14.7.4 体会闭包的好处
返回的匿名函数和
makeSuffix (suffix string)
的suffix
变量 组合成一个闭包,因为 返回的函数引用到suffix
这个变量我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如
.avi
而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。大家可以仔细的体会一把!