scala函数进阶

51 阅读2分钟

1. 函数字面量

2. 高级函数

(一)函数的字面量语法

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

它省略了def,函数名以及函数的返回值类型。最大公约数(Greatest Common Divisor, GCD)是指能同时整除两个或多个整数的最大正整数。

object Base47 {
  //定义一个函数,计算两数的和
  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 smu3 :(Int,Int) => Int = {_ + _}
  val sum4 = (_:Int) + (_:Int)
  
  def main(args: Array[String]): Unit = {
    val a = 2
    val n = 5
    println(s"$a + $n = ${sum1(a,n)}")
    println(s"$a + $n = ${sum2(a,n)}")
    println(s"$a + $n = ${smu3(a,n)}")
    println(s"$a + $n = ${sum4(a,n)}")

  }
}

(二)把函数作为 参数

object Base48 {
  //定义一个函数,计算两数的和
  //定义一个字面量函数,计算两个数的较大者
  val getMax = (x:Int,y:Int) => if(x>y) x else y

  //定义一个字面量函数,计算两个数的较小者
  val getMin = (x: Int,y:Int) => if(x<y) x else y

  //test 这个函数,它的第一个参数是一个函数。
  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)
  }
}

(六)Scala部分应用函数

// 定义普通函数  
def mutlti(x:Int, y:Int, z:Int) = {  
  println(s"$x, $y, $z")  
  x * y * z  
}  
// 传入部分参数,返回部分函数  
var f1 = mutlti(2, _, _)  
// 调用部分函数  
println( f1(10, 5) )
object Base49 {
  //部分应用函数,在调用函数的时候,只传入一部分参数。
  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)
  }
}