(十三)函数进阶

59 阅读2分钟

(一)函数的字面量语法

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

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

例如


object Base57 {
  //定义一个函数,计算量数之和
  def sum (x:Int, y:Int):Int = {
    x + y
  }
  // 字面量语法 看起来就像给变量赋值

  // val a = 1
    val sum1 = (x:Int, y:Int) => { x + y }
  
  def main(args: Array[String]): Unit = {
    val a = 2
    val n = 5
    println(s"$a + $n = ${sum1(a, n)}")
  }

}
Scala的函数字面量的简化方式有两种方式:
  1. :_(占位符)。如果函数中的参数在方法体中只使用了一次,可以用_替换。
  2. :只有一个表达式时,可以省略括号。
  3. 要点:
    1. 有一个箭头符号 =>
    1. 省略def,省略了返回值类型

注意

  • 函数只有一句代码,可以省略 {}
  • 如果参数只使用了一次,那么可以用 _ 来代替~要加上参数的类型
  • 例如代码

object Base58 {
  // 定义一个函数,计算两数的和
  def sum(x: Int, y: Int): Int = {
    x + y
  }

  // 字面量语法:看起来就像给变量赋值
  val sum1 = (x: Int, y: Int) => { x + y }
  /*
  * 特殊的写法-简写
  * 1. 函数只有一句代码,可以省略 {}
  * 2. 如果参数只使用了一次,那么可以用 _ 来代替~要加上参数的类型
  */
  val sum2 = (x: Int, y: Int) => x + y
  val sum3: (Int, Int) => Int = { _ + _ }
  val sum4: (Int, Int) => Int = _ + _

  def main(args: Array[String]): Unit = {
    val a = 2
    val n = 5
    println(s"a + n = ${sum1(a, n)}")
    println(s"a + n = ${sum2(a, n)}")
    println(s"a + n = ${sum3(a, n)}")
    println(s"a + n = ${sum4(a, n)}")
  }

}

(二)把函数作为参数

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

  // 定义一个字面量函数,计算两个数的较大者
  val getMax = (x: Int, y: Int) => if(x>y) x else y

  // 定义一个字面量函数,计算两个数的较小者
  val getMin = (x: Int, y: Int) => if(x<y) x else y

  // test 这个函数,它的第一个参数是一个函数。
  val test = (x: (Int,Int)=>Int, a: Int, b: Int ) => {
    println("test被调用")
    println( x(a,b) )
  }

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

    test(getMax, 1, 2)
  }
}

(三)Scala部分应用函数

  • 如果一个函数包含多个参数,对该函数传递部分参数使得这个函数返回一个函数,那么这种函数叫做部分应用函数。
  • 部分应用函数,在调用函数的时候,只传入一部分参数。
object Base60 {
  // 部分应用函数,在调用函数的时候,只传入一部分参数。
  val mul = (a: Int, b: Int, c: Int) => a * b * c

  def main(args: Array[String]): Unit = {
    val rst = mul(1, 3, 4)
    val f = mul(2, 3, _)  // 第三个参数传入一个 _ ,表示:这个参数先空置,也不能返回最后的计算结果。它的返回值是一个函数,部分应用函数
    var rst1 = f(5)  // mul(2,3,5)
    println(rst)
    println(rst1)
  }
}