Scala—函数进阶

38 阅读2分钟

前面我们学习了递归函数,今天一起来学习进阶函数。

OIP-C.webp

一、函数的字面量语法

除了def之外,还有另一种定义函数的方式:字面量。

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

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

代码示例:

// 定义函数的方式二:字面量
val getSum1 = (x:Int, y:Int) => {
  x + y
}

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

函数字面量的简化写法:

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

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

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

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为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。

把一个函数当做参数 传递给另一个函数

// 定义两个字面量函数。
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))
}

Snipaste_2025-10-21_09-28-40.png

三、部分应用函数

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

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就是部分应用函数
    println(t(50))

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

    println(t1(20,50))
    
  }

运行结果:

Snipaste_2025-10-21_10-07-00.png