嵌套函数
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提供了嵌套函数的能力,因此仍然可以从函数式的编码风格中获益。