Scala函数进阶

89 阅读2分钟

函数的字面量语法

除了使用def之外的,另一种定义函数的方式 ,它有两种定义方式;如下:

// 定义函数的方式一:def
def getSum(x:Int,y:Int):Int={
  x+y
}
// 定义函数的发方式二:字面量
def main(args:Array[String]):Unit={
  println(getSum(10,20))
  println(getSum(10,20))
}

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

它省略了def,函数名以及函数的返回值类型,他还有两种简化写法,分别是省略{}和使用 _ 来代替形参,并且_有两种声音方法。

案例:

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))
}

把函数作为参数

把函数当作参数传递给另一个函数,它有两种表现方法;第一种是定义两个字面函数,第二种是定义一个有三个参数的函数,如下。

// 定义两个字面函数。(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))// === f1(10,20)
  println(test(f2,10,20))
}

部分应用函数

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

如: 如果一个函数需要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 就是部分应用函数!
  val t1 = getSum(_, 20, _) // t 就是部分应用函数!

  println(t(50))
  println(t1(20, 50))
}