函數與閉包(十三)

簡介

  Scala 有方法與函數,二者在語義上的區別很小。Scala 方法是類的一部分,而函數是一個對象可以賦值給一個變量。換句話來說在類中定義的函數即是方法。
我們這裏會統稱爲函數。

  Scala 中的函數是一個繼承了 Trait類的對象。函數定義由一個 def 關鍵字開始,緊接着是可選的參數列表,一個冒號 : 和方法的返回類型,一個等號 = ,最後是方法的主體。

def functionName ([參數列表]) : [return type]

  如果沒有等號和方法主體,那麼函數會被隱式聲明爲抽象(abstract)。

基本函數

//將兩個傳入的參數相加並求和
object add{
   def addInt( a:Int, b:Int ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}
//如果沒有返回值,可返回Unit類型
object Hello{
   def printMe( ) : Unit = {
      println("Hello, Scala!")
   }
}
//函數調用
object Test {
   def main(args: Array[String]) {
        println( "Returned Value : " + addInt(5,7) );
   }
   def addInt( a:Int, b:Int ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

函數傳名調用

scala解釋器在解析函數參數時有兩種方式

  • 傳值調用(call-by-value):先計算參數表達式的值,再應用到函數內部
  • 傳名調用(call-by-name):將未計算的參數表達式直接應用到函數內部,每次使用傳名調用時,解釋器都會計算一次表達式的值。
object Test {
   def main(args: Array[String]) {
        delayed(time());
   }

   def time() = {
      println("獲取時間,單位爲納秒")
      System.nanoTime
   }
   def delayed( t: => Long ) = {
      println("在 delayed 方法內")
      println("參數: " + t)
      t
   }
}

函數指定參數名

  一般情況下函數調用參數,就按照函數定義時的參數順序一個個傳遞。但也可以通過指定函數參數名,並且不需要按照順序向函數傳遞參數,實例如下:

object Test {
   def main(args: Array[String]) {
        printInt(b=5, a=7);
   }
   def printInt( a:Int, b:Int ) = {
      println("Value of a : " + a );
      println("Value of b : " + b );
   }
}

可變參數

  Scala 通過在參數的類型之後放一個星號來設置可變參數。

object Test {
   def main(args: Array[String]) {
        printStrings("Runoob", "Scala", "Python");
   }
   def printStrings( args:String* ) = {
      var i : Int = 0;
      for( arg <- args ){
         println("Arg value[" + i + "] = " + arg );
         i = i + 1;
      }
   }
}

默認參數值

  Scala 可以爲函數參數指定默認參數值,使用了默認參數,在調用函數的過程中可以不需要傳遞參數,這時函數就會調用它的默認參數值,如果傳遞了參數,則傳遞值會取代默認值。實例如下:

object Test {
   def main(args: Array[String]) {
        println( "返回值 : " + addInt() );
   }
   def addInt( a:Int=5, b:Int=7 ) : Int = {
      var sum:Int = 0
      sum = a + b

      return sum
   }
}

匿名函數

  scala 中定義匿名函數的語法很簡單,箭頭左邊是參數列表,右邊是函數體。比如,

var inc = (x:Int) => x+1

閉包

  閉包是一個函數,返回值依賴於聲明在函數外部的一個或多個變量。

object Test {  
   def main(args: Array[String]) {  
      println( "muliplier(1) value = " +  multiplier(1) )  
      println( "muliplier(2) value = " +  multiplier(2) )  
   }  
   var factor = 3  
   val multiplier = (i:Int) => i * factor  
}  

忠於技術,熱愛分享。歡迎關注公衆號:java大數據編程,瞭解更多技術內容。

這裏寫圖片描述

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