scala教程:闭包

介绍

闭包的必要条件:

  1. 外部函数必须 返回 一个 函数对象
  2. 返回的函数对象内,必须引用 外部函数 的 形参 或 局部变量

返回的函数就称为: 闭包

注意:

  1. 不是全局变量
  2. 返回的函数对象内,不一定要return

作用

  • 可以封装函数局部变量

例子

def main(args: Array[String]): Unit = {
  def add(i:Int,j:Int):() => Int ={
    def fun():Int= {
      return i + j
    }
    /*
    注意返回的是fun,后面没有小括号
    有小括号表示调用函数
    */
    return fun
  }
}

说明:

在函数 add() 内定义了 内部函数fun() ,在 fun() 函数中 引用了外部函数 add() 的 形参 或者 局部变量 ,并将 fun返回

注意:

返回的是 fun,后面 不能有小括号 ,有小括号 表示 调用函数

调用

//调用add()时,返回的并不是求和结果,而是求和函数
val addFun=add(1,1)
//打印函数的内存地址
println(addFun)
//后面加小括号表示调用
println(addFun())

另一种调用方式:

println(add(1,1)())
println(add(2,2)())

可以保存局部变量

见下面的代码,在函数内部对变量进行修改

def main(args: Array[String]): Unit = {
  var i:Int=0
  def sum(a:Int):Int = {
    i += a
    i
  }
  sum(1)
  println(i)
  sum(2)
  println(i)
  sum(3)
  println(i)
}

上面的代码使用了变量,可以通过闭包方式隐藏掉

改造成闭包

def main(args: Array[String]): Unit = {

  def sum():(Int) => Int = {
    var i = 0

    def fun(a:Int): Int = {
      i += a
      i
    }
    fun
  }

  val sumFun:(Int) => Int =sum()
  println(sumFun(1))
  println(sumFun(2))
  println(sumFun(3))
}
总结:

sum() 函数的局部变量 i,可以保存住数据

内部用lambda表达式

def main(args: Array[String]): Unit = {

  def sum():(Int) => Int = {
    var i: Int = 0
    a => {
      i+=a
      i
    }
  }

  val sumFun = sum()
  println(sumFun(1))
  println(sumFun(2))
  println(sumFun(3))
}

原文出处:/show_1IX1BkhBXuDD.html