Scala函数之闭包与简化、柯里化

Scala函数之闭包与简化

基本介绍

闭包:一个函数和与其相关的引用环境组合的一个整体(实体)。个人理解就是把最内层函数需要的参数包装起来,使得在外层函数出栈时参数还存在于堆中,从而得到内层函数所要的结果。

柯里化:把一个参数的多个参数,变成多个参数列表。

闭包代码理解

通过代码去理解scala中的闭包

package chapter02

object Test07_ClosureAndCurrying {
  def main(args: Array[String]): Unit = {
    def add(a: Int, b: Int): Int = {
      a + b
    }

    println(add(2, 3))

    def addByFour1(b: Int): Int = {
      4 + b
    }

    def addByFive(b: Int): Int = {
      5 + b
    }

    def addByFour3(): Int=>Int = {
      val a = 4
      def addB(b: Int): Int = {
        a + b
      }
      addB
    }
    println(addByFour3()(5))

    // 内层函数addB需要使用外层函数addA中的a参数,如果没有闭包,则当外层函数addByA运行完出栈后,参数a也会随之消失,
    // 但这里内层函数还是addB还是能引用参数a,说明形成了闭包
    def addByA(a: Int): Int=>Int = {
      def addB(b: Int): Int = {
        a + b
      }
      addB
    }
    println(addByA(21)(21))

    // 逐渐简化,很离谱
    // 1、返回值是一个函数,可以改为匿名函数,即不需要函数名、函数返回值
    def addByA1(a: Int): Int=>Int = {
      (b: Int) => {
        a + b
      }
    }

    // 2、b的返回值已经在addByA2中定义好了,所以可以省略
    def addByA2(a: Int): Int=>Int = {
      b => {
        a + b
      }
    }

    // 3、返回值只有一行,可以省略{}
    def addByA3(a: Int): Int=>Int = {
      b => a + b
    }

    // 4、如果参数在后面只出现一次,可以省略参数,直接使用下划线(_)代替
    def addByA4(a: Int): Int=>Int = a + _
    
	// 5、柯里化,推荐使用
    def addCurrying(a: Int)(b: Int): Int = {
      a + b
    }

    println(addCurrying(3)(4)) // 7

  }
}

就是这么简单粗暴!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值