5.5 嵌套函数

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

© 版权声明
THE END
喜欢就支持一下吧
点赞266赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

夸夸
夸夸
还有吗!没看够!
取消
昵称表情代码图片

    暂无评论内容