函数进阶

33 阅读2分钟

(一) 函数 字面量 语法

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

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

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

object practice17 {
  /*
  * 函数字面量
  * 另一种定义函数的方式
  * */

  // 定义函数的方式一: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的函数字面量的简化方式有两种方式:

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

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

// 省略{}
val getSum2 = (x:Int,y:Int) => x+y

// 使用 _ 来代替形参
val getSum3 = (_:Int) + (_:Int)

// val getSum4:数据类型 => 数据类型 = _+_
val getSum4:(Int,Int)=>Int = _+_

(二)把 函数作为 参数

定义一个函数。它的特点是:第一个参数的类型是函数

object practice18 {
  /*
  * 把一个函数 当做参数 传递给另一个函数
  * */


  // 定义两个字面量函数。(Int,Int) => Int 看成一种数据类型
  val f1:(Int,Int) => Int = _ + _
  // val a:Int

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

  // 定义一个函数,它有三个参数
  // 参数一:类型是(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))

(三) 部分应用函数

如果一个函数需要三个函数,而我们只给了两个参数,会怎么样?

会报错

但是可以用_来代替参数,此时t和t1就是部分应用函数

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(20,50))