嵌套函数

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


《PySpark原理深入与编程实战》