函数进阶

42 阅读1分钟

函数的字面语法

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

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

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

简化写法

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

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

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

object Sc44 {
  def sum(x:Int, y:Int):Int = {
    x + y
  }
  val sum1 = (x:Int, y:Int) => { x + y }
  val sum2 = (x:Int, y:Int) => x + y
  val sum3:(Int,Int) => Int = { _ + _ }
  val sum4 = (_: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 Sc45 {
  val getMax = (x:Int, y:Int) => if(x>y) x else y
  val getMin = (x:Int, y:Int) => if(x<y) x else y
  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 Sc46 {
  val mul = (a:Int, b:Int, c:Int) => a * b * c
  def main (args: Array [String]): Unit = {
    val rst = mul (2,3,4)
    val f = mul (2,3, _)
    var rst1 = f (5)
    println (rst)
    println (rst1)
  }
}