對scala函數總結

1.普通函數(有參函數、無參函數)

def fun (a: Int , b: Int ) : Unit = {
   println(a+b)
 }
fun(1,1)
    
def fun1 (a : Int , b : Int)= a+b
    println(fun1(1,2))  

2.遞歸函數:在函數體內調用自己本身

// 計算num的階乘
def fun1(num:Int):Int = {
    if(num == 1||num == 0) 1
    else num * fun1(num - 1)
}

3.默認值的函數

 def fun2(num1:Int = 10,num2:Int = 20) = {
    num1 + num2
}
  
  def fun3(num1:Int,num2:Int = 20) = {
    num1 + num2
}
  
  def fun4(num1:Int=10,num2:Int) = {
    num1 + num2
}

4.可變參數個數的函數

def fun4(elements :Int*)={
      var sum = 0;
      for(elem <- elements){
        sum += elem
      }
      sum
}
    println(fun4(1,2,3,4))

5.匿名函數

var fun6 = (num1:Int,num2:Int) => num1+ num2

6.嵌套函數

def fun7(num:Int)={
      def fun8(a:Int,b:Int):Int={
        if(a == 1){
          b
        }else{
          fun8(a-1,a*b)
        }
      }
      fun8(num,1)
}

7.偏應用函數

偏應用函數是一種表達式,不需要提供函數需要的所有參數,只需要提供部分,或不提供所需參數。

 def log(date:Date,content:String) = {
    println("date:" + date + "\tcontent:" + content)
  }
  
  val date = new Date()
  log(date,"log1")
  log(date,"log2")
  log(date,"log3")
  println("==============================")
    
  val logBoundDate = log(date,_:String)
  logBoundDate("log11")
  logBoundDate("log12")
  logBoundDate("log13")

8.高階函數

函數的參數是函數,或者函數的返回類型是函數,或者函數的參數和函數的返回類型都是函數的函數。

/**
   * 函數的參數是函數:
   * f1:(Int)=>Int  告訴要傳入的函數的格式 
   * 把函數當成了對象穿來穿去、scala支持面向函數編程
   */
  def highFun1(f1:(Int)=>Int,num:Int) = {
    f1(num)
  }
  
  def tmpFun(num1:Int) = {
    num1+1000
  }
  
  /**
   * 函數的返回是函數
   * 函數無參數
   * 函數的返回個(Int,Int)=>Double格式的函數
   */
  def highFun2():(Int,Int)=>Double = {
    def tmpFun2(num1:Int,num2:Int):Double = {
      num1 + num2
    }
    tmpFun2
  }
  
  def highFun3():(Int,Int)=>Double = {
    (num1:Int,num2:Int)=>num1+num2
  }
  
   /**
    * 函數是參數是函數,返回也是函數
    * 這個函數也是高階函數
    */
  def highFun4(f1:(Int,Int) => Int,num1:Int):(Int)=>Double = {
    val rest = f1(num1,1000)
    (num:Int) => num + 1
  }
  
  def highFun5(num:Int):(Int)=>Int = {
    def fun(a:Int)={
      num + a
    }
    fun
  }

9. 柯里化函數

可理解爲對高階函數的簡化

def klhFun(a:Int)(b:Int) = a*b

Scala語言的簡寫規則:

函數的返回值類型可以省略,因爲scala具備自動推測的功能,他會根據返回值的自動來決定這個函數的返回值類型
將你要返回的值放在函數的最後一行,那麼這個值就會被自動返回
如果你的函數體內只有一個語句,可以將這行語句與函數名在一行。
總結:

對於遞歸函數 必須明確返回值類型,不然不知所措;
默認值的函數中,如果傳入的參數個數與函數定義相同,則傳入的數值會覆蓋默認值;如果不想覆蓋默認值,傳入的參數個數小於定義的函數的參數,則需要指定參數名稱;
在scala中+=前後的數值類型必須一致,+前後的數值類型可以不一致;
注意點:
1)匿名函數不能顯示的聲明返回值類型
2)匿名函數必須賦給一個變量、變量,通過變量來調用這個匿名函數
3)匿名函數的參數與函數體必須要用=>來關聯
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章