函数进阶

44 阅读2分钟

(一)函数的字面量语法

(二)把函数作为参数

(三)Scala部分应用函数

函数的字面量语法

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

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

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

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

  // 定义函数的方式一:def
  def getSum(x: Int, y: Int):Int = {
    x + y
  }

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

Scala的函数字面量的简化方式

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

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

object I02 {
  /*
  * 函数字面量的简化写法
  * 1.代码只有一句,省略{ }
  * 2._ 占位符未曾换形态
   * */


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

把函数作为参数

在 Scala 中,函数是 “一等公民”,这意味着函数可以像其他数据类型(如整数、字符串等)一样被当作参数传递。下面我们通过代码示例来展示如何把函数作为参数传递给另一个函数。

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

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

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

  // 定义一个函数,它有三个参数
  // 参数1:类型是(Int,Int)=>Int。它表示这里需要一个函数
  def test(fn:(Int,Int)=>Int, x:Int, y:Int) = {
    fn(x,y)
  }

  def main(args: Array[String]): Unit = {
    println( test(f1,10,20))
    println( test(f2,10,20))
  }
}

部分应用函数

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

object I04 {
  /*
   * 部分应用函数
   * 如果一个函数需要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) )
  }
}