Scala的函数进阶

(1)函数的字面量语法

除了使用def之外的,另一种定义函数的方式

语法: var 变量 = (参数列表) =>{方法体}

object TestFuncMore {
  //用def来定义函数
  def sum(x:Int,y:Int)={
    x + y
  }

  def main(args: Array[String]): Unit = {
    //1.定义函数的另一种方式 字面量
    // 格式:var 变量 = 函数
    //var getSum = (x:Int,y:Int) => {x + y}

    //简写1:函数内部只有一句,所以可以省略{}
    //var getSum = (x:Int,y:Int) => x + y
    //简写2:如果变量只有了一次,可以用占位符 _
    //(Int,Int) =>Int它是一个类型。具体来说,就一个函数,接收两个int参数,返回一个int值
    var getSum:(Int,Int) =>Int = _+_
    println(sum(1,2))
    println(getSum(10,2))
  }

}

(2)把函数当作参数传递给另一个函数

  def main(args: Array[String]): Unit = {
  //2.把函数当作参数传递给另一个函数
    var add = (x:Int,y:Int) => x + y

    var mul = (x:Int,y:Int) => x*y
    var op = (callback:(Int,Int)=>Int,a:Int,b:Int) => {
     callback(a,b)
    }
    println(op(add,2,3))
    println(op(mul,2,3))

}

(3)把函数作为返回值

  //3.把函数当作返回值
  def main(args: Array[String]): Unit = {
    //val multiplyBy = (x:Int) :Int => Int => {(factor:Int) => x *factor}

    //函数f的返回值就是一个函数
    var f = (x:Int) => {
      //println(x)
//      var f1 = (y:Int) => x + y
//      f1 //返回值是一个函数
      (y:Int) => x + y
    }
    var s = f(2)  //s是一个函数
    var res = s(10)
    println(res)
  }

(4)闭包

  //4.闭包:函数引用了非局部变量,就形成了闭包。 closure
  def main(args: Array[String]): Unit = {
    //函数f 的返回值就是一个函数
    var f = (x:Int) => {
      //对于函数t来说,它可以访问到x,x不是它的局部变量
      //t被返回了
      var t = (y:Int) => x + y
      t
    }
    var s = f(2) // s是一个函数,它就指向了t函数,2传给了x。
    var res1 = s(10) //当执行函数时,它仍然可以引用到2
    var res2 = s(100)
    println(res1,res2)
  }

(5)柯里化格式的定义

  //5.柯里化格式的定义
  def main(args: Array[String]): Unit = {
    //字面量格式
    var f = (x:Int,y:Int) => {
      x + y
    }
    //标准格式
    def f1(x:Int,y:Int) = {
      x + y
    }
    //柯里化格式:把多个参数拆出来,一个一个定义
    def f2(x:Int)(y:Int) = {
      x + y
    }
    println(f(1,2))
    println(f1(1,2))
    println(f2(1)(2))
  }

(6)部分应用函数

  //6.部分应用函数
  //作用:分布计算
  def main(args: Array[String]): Unit = {
    def f1(x:Int,y:Int,z:Int)={
      println(s"x=$x,y=$y,z=$z")
      x + y + z
    }
    //传入部分参数,就是下划线
    var s1 = f1(1,_,3)  //部分函数
    println(s1(10))

    var s2 = f1(1, _, _) //部分函数
    println(s2(9,10))
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值