14函数进阶

22 阅读3分钟

(一)函数的字面量语法

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

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

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

定义

val sum1 = (x:Int, y:Int)=>{x+y}

调用

var s = sum1(10,34)

简化写法

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

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

第二种方式为:只有一个表达式时,可以省略括号。 val sum1 = (x:Int, y:Int) =>{x+y}
val sum2 = (x:Int, y:Int) => x+y
val sum3:(Int, Int)=>Int = _ + _

object Base51 {
  // 定义一个函数,计算两数的和
  def sum(x: Int, y: Int): Int = {
    x + y
  }
    // 字面量语法:匿名函数赋值给变量赋值
  // val a = 1
  val sum1 = (x: Int, y: Int) => { x + y }
    /*
     * 1. 有一个箭头符号 =>
     * 2. 省略def,省略了返回值类型
     *
     * 特殊的写法-简写
     * 1. 函数只有一句代码,可以省略 { }
     * 2. 如果参数只用了一次,那么可以用 _ 来代替
     */

  val sum2 = (x: Int, y: Int) => x + y

  val sum3: (Int, Int) => Int = { (x, y) => x + y }

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

  def main(args: Array[String]): Unit = {
    val a = 2
    val n = 5
    println(s"a = $a + $n = ${sum1(a, n)}")
    println(s"a = $a + $n = ${sum2(a, n)}")
    println(s"a = $a + $n = ${sum3(a, n)}")
    println(s"a = $a + $n = ${sum4(a, n)}")
  }
}

结果如图:

image.png

(二)函数作为参数

某个函数的参数是函数

定义一个接收函数作为参数的函数def a(f:()=>Unit)={},其中函数的类型()=>Unit部分()为函数的参数,Unit为函数的返回值。通过定义字面量传递值时,字面量必须和函数的类型匹配。

object Base52 {
  // 定义一个函数,计算两数的和

  // 定义一个字面量函数,计算两个数的较大者
  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)
  }
}

结果如图:

image.png

(三)函数作为返回值

函数的返回值是一个函数。

(四)Scala的函数的闭包

闭包是:一个函数连同该函数的非局部变量的一个引用环境。

函数和变量的定义要在同一个作用域,函数可以引用已经创建的变量,函数可以同值一样被传递和应用,当执行函数时该函数仍然引用着变量。

(五)函数的柯里化格式定义

定义函数的另一种格式。

柯里化的定义语法为:

def 函数名(参数列表1)(参数列表2)...(参数列表n):type={

方法体

}

柯里化(Currying)是函数式编程中的一个非常重要的概念,得名于美国数学家 Haskell Curry。柯里化的基本思想是将一个接受多个参数的函数转变为一系列只接受一个参数的函数,并返回接受下一个参数的新函数。

(六)Scala部分应用函数

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

object Base53 {
  // 部分应用函数:在调用函数的时候,只传入一部分参数。
  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, _)  // 前三个参数传入一个 _ ,表示:这个参数为空值,也不影响最后的计算结果。他的返回值是一个函数,部分应用函数
    val rst1 = f(5)  // mul(2,3,5)
    println(rst)
    println(rst1)
  }
}

结果如图:

image.png