Scala

20 阅读3分钟

1. 函数字面量;

2. 部分应用函数。

(一)函数的字面量语法

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

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

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

【编码示范】

less
 体验AI代码助手
 代码解读
复制代码
object base42 {
  /*
  *函数自变量
  *另一种定义函数的方式
  * */

  // 定义函数的方式一: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))
  }
}

【简化写法】

kotlin
 体验AI代码助手
 代码解读
复制代码
object base43 {
  /*
  *函数字面量的简化写法有两种
  *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))
  }
}

(二)把函数作为参数

某个函数的参数是函数

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

【编码示范】

kotlin
 体验AI代码助手
 代码解读
复制代码
object base44 {
  /*
  *把一个函数当做参数 传递给另一个函数
  * */

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

(三)把函数作为返回值

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

【编码示范】

scss
 体验AI代码助手
 代码解读
复制代码
def main(args: Array[String]): Unit = {  
    // 函数f 的返回值就是一个函数  
    var f = (x:Int) => {  
      // println(x)  
      //      var f1 = (y:Int) => x + y  
      //      f1 // 返回值是一个函数  
      (y:Int) => x + y  
    }  
  
    var s = f(2) //  s 是一个函数  
    var res = s(10)  
    println(res)  
  }

(四)Scala部分应用函数

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

scss
 体验AI代码助手
 代码解读
复制代码
object base45 {
  /*
  *部分应用函数
  *如果一个函数需要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))
  }
}