1. 程式人生 > >Scala12——Scala高階函式

Scala12——Scala高階函式

Scala混合了面向物件和函式式的特性,我們通常將可以作為引數傳遞到方法中的表示式叫做函式。在函數語言程式設計語言中,函式是“頭等公民”,高階函式包含:作為值的函式、匿名函式、閉包、柯里化等等。

1、作為值的函式

可以像任何其他資料型別一樣被傳遞和操作的函式。 定義函式時格式:val 變數名 = (輸入引數型別和個數) => 函式實現和返回值型別 “=>”左面表示輸入引數名稱、型別和個數,右邊表示函式的實現和返回值型別

object Test{
  def main(args: Array[String]): Unit = {
    val arr=Array(1,2,3,4,5)
    //定義一個函式並將值賦給變數func1
    val func1=(x:Int)=>x+5
    //將函式作為引數傳入arr的map方法中
    val arr2=arr.map(func1)
    println(arr2.toList)
  }
}

2、匿名函式

在Scala中,不需要給每一個函式命名。我們把沒有將函式賦給變數的函式叫做匿名函式。

 val arr=Array(1,2,3,4,5)
    //直接將匿名函式傳入到map方法中,效果和前面一樣
    val arr2=arr.map((x:Int)=>x+5)
    println(arr2.toString)

由於Scala可以自動推斷出引數的型別,所以可以簡寫:

 val arr2=arr.map(x=>x+5)

下劃線模式:

 val arr2=arr.map(_+5)

3、柯里化

柯里化(Currying)指的是把原來接受多個引數的函式變換成接受一個引數的函式過程,並且返回接受餘下的引數且返回結果為一個新函式的技術。 柯里化(Currying)函式是一個帶有多個引數,並引入到一個函式鏈中的函式,每個函式都使用一個引數。

在這裡插入圖片描述

scala柯里化風格的使用可以簡化主函式的複雜度,提高主函式的自閉性,提高功能上的可擴張性、靈活性。可以編寫出更加抽象,功能化和高效的函式式程式碼。

4、閉包

閉包是一個函式,返回值依賴於 宣告在函式外部的一個或多個變數。 閉包通常來講可以簡單的認為是可以訪問不在當前作用域範圍內的一個函式。

	val y=10
      //變數y不處於其有效作用域時,函式還能夠對變數進行訪問
        val add=(x:Int)=>{
          x+y
        }
    //在add中有兩個變數:x和y。其中的一個x是函式的形式引數,
    //在add方法被呼叫時,x被賦予一個新的值。
    // 然而,y不是形式引數,而是自由變數
    println(add(5)) // 結果15