Scala函数的进阶

52 阅读2分钟

内容:

1. 函数字面量;

2. 函数作为参数;

3. 部分应用函数。

一, 函数的字面量语法

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

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

它省略了def,函数名以及函数的返回值类型。

代码如下:

object gaodef01 {
  /*
  函数的字面量
  另一种定义函数的方式
   */
  // 定义函数的方式一:def
  def getSum(x:Int,y:Int):Int = {
    x+y
  }
  // 丁一函数的方式二:字面量
  val getSum1 = (x:Int,y:Int) =>{
    x+y
  }

  def main(args: Array[String]): Unit = {
    println(getSum(10,20))
    println(getSum1(10,20))
  }
}

Scala的函数字面量的简化方式有两种方式:

第一种方式为:_(占位符)。如果函数中的参数在方法体中只使用了一次,可以用_替换。

第二种方式为:只有一个表达式时,可以省略括号。

代码如下:

object gaodef02 {
  /*
  函数的字面量的简化写法
  1,代码只有一句,省略{}
  2,_ 占位符来替换形参
   */
  //
  val getSum = (x:Int,y:Int) => {
    x+y
  }
  // 省略{}
  val getSum1 = (x:Int,y:Int) => x+y

  //用占位符代替形参
  val getSum2 = (_:Int) + (_:Int)

  //用占位符代替形参,(Int,Int)=>Int 就是getSum3的类型
  val getSum3:(Int,Int) => Int = _+_

  def main(args: Array[String]): Unit = {
    println(getSum(10,20))
    println(getSum1(10,20))
    println(getSum2(10,20))
    println(getSum3(10,20))
  }
}

二,函数作为参数

代码 案例:定义一个接收函数作为参数的函数def a(f:()=>Unit)={},其中函数的类型()=>Unit部分()为函数的参数,Unit为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。

代码如下:

object gaodef03 {
  /*
  把一个函数 当做参数 传递给另一个函数
   */
  // 定义两个字面量函数。(Int,Int) => Int 看成一种数据类型
  val f1:(Int,Int) => Int =_+_
  // val a:Int

  val f2:(Int,Int) => Int = _*_

  //定义一个函数,它有三个参数
  //参数1:类型是(Int,Int)=>Int,表示资料需要一个函数
  def test(fn:(Int,Int)=>Int,x:Int,y:Int):Int = {
    fn(x,y)
  }
  def main(args: Array[String]): Unit = {
    println(test(f1,10,20))
    println(test(f2,10,20))
  }
}

三,Scala部分应用函数

如果一个函数包含多个参数,对该函数传递部分参数使得这个函数返回一个函数,那么这种函数叫做部分应用函数。

object gaodef04 {
  /*
  部分应用函数
   */
  def getSum(a:Int,b:Int,c:Int):Int = {
    a+b+c
  }

  def main(args: Array[String]): Unit = {
    println(getSum(10,20,30))

    val t = getSum(10,20,_)//t就是部分应用函数
    
    val t1 = getSum(_,20,_)//t就是部分应用函数
    println(t(50))
    println(t1(10,50))
  }
}