嵌套函数
Scala允许用户在函数中定义函数。这称为嵌套函数,其中内部函数称为局部函数。以下代码表示嵌套的函数。
def bookAssignAndDisplay(bookId:Int,bookname:String) = {
def getBookDetails(bookId:Int,bookName:String):String = {
s" bookId是${bookId},书名是${bookName}"
}
def display{
println(getBookDetails(bookId,bookName))
}
display
}
bookAssignAndDisplay(101,"Spark大数据处理技术")
这里,在函数bookAssignAndDisplay中定义了两个内部函数,getBookDetails和display。
以下代码显示了外部函数变量的作用域。
def outerFunction(){
var outerVariable ="Out"
def innerFunction(){
println(s"outerVariable变量的值是: $outerVariable") // 可以访问外部函数中声明的变量
}
innerFunction()
}
outerFunction()
以下代码显示了内部函数变量的作用域:
def outerFunction(){
var outerVariable = "Out"
def innerFunction(){
var innerVariable ="In"
println(s"outerVariable变量的值是:$outerVariable") // 可以访问外部函数中声明的变量
}
innerFunction()
println(s"innerVariable变量的值是:$innerVariable") // 出错:不可以访问内部函数中声明的变量
}
由以上两个示例的代码可知,外部函数中声明的变量可以在内部函数中访问,但是内部函数中声明的变量在外部函数中没有作用域。
下面是定义和调用一个嵌套函数的示例。
object demo {
def checkAvailabilityWithNestedFunction(pName: String): Boolean = {
// 检索当前库存的商品列表
val listFromStock = List[String]("电脑", "打印机", "办公椅", "饮水机")
// v通过业务逻辑验证donutName参数
val validate = (name: String) => {
name.nonEmpty && name.length > 0
}
// 首先运行validate,然后检查列表中是否有匹配的商品
val isInStock = validate(pName) && (listFromStock contains pName)
isInStock
}
def main(args: Array[String]): Unit = {
println(s"验证结果 = ${checkAvailabilityWithNestedFunction("办公椅")}")
println(s"验证结果 = ${checkAvailabilityWithNestedFunction("汽车")}")
}
}
执行以上代码,输出结果如下所示:
验证结果 = true 验证结果 = false
在函数式编程中,应该尝试将逻辑分解成其他更小的函数。但有时逻辑与特定的函数紧密耦合,而Scala提供了嵌套函数的能力,因此仍然可以从函数式的编码风格中获益。