函数作为返回值(闭包和柯里化的使用)

一般写法

 // 一般写法
def fun1(): (String) => String = {
    
    

  // 内部函数
  def f(s: String): String ={
    
    
    s
  }
  // 函数作为返回值
  f _
}

// 调用
val ff: String => String = fun1()
println(ff("hello"))
// 或者
println(fun1()("hi"))

闭包概念

        内部函数访问外部函数的变量,当外部函数执行结束后,栈内存空间释放,但是会自动延长变量的生命周期,这时,外部变量和内部函数就形成了闭包。

闭包的使用

// 外部函数
def fun1(): (Int) => Int ={
    
    
  // 外部函数变量
  var a = 10

  // 内部函数
  def fun2(b: Int): Int = {
    
    
    a + b
  }
  
  // 作为值返回
  fun2 _
}

// 调用
println(fun1()(20))

// 闭包的简化
def f3(): (Int) => Int ={
    
    
  var a = 10

  (b: Int) => a + b
}
// 调用简化版闭包
// println(f3()(20))

柯里化的概念

        将函数的一个参数列表中的多个参数,拆分为多个参数的形式。

柯里化的使用

// 柯里化
def fun1()(b: Int): Int = {
    
    
  var a = 10
  a + b
}

val res: Int = fun1()(20)
println(res)

// 柯里化运行时会转为如下效果
def fun1(): (Int) => Int = {
    
    
  var a = 10
  (b: Int) => a + b
}

柯里化的好处

  • 每一个参数列表表示一个函数,清晰明确。
  • 简化闭包代码的编写。

猜你喜欢

转载自blog.csdn.net/FlatTiger/article/details/114397685