Scala函數字面量


Scala中函數為頭等公民,你不僅可以定義一個函數然后調用它,而且你可以寫一個未命名的函數字面量,然后可以把它當成一個值傳遞到其它函數或是賦值給其它變量。下面的例子為一個簡單的函數字面量(參考整數字面量,3 為一整數字面量)。

(x :Int ) => x +1

這是個函數字面量,它的功能為+1. 符好 => 表示這個函數將符號左邊的東西(本例為一個整數),轉換成符號右邊的東西(加1)。 函數字面量為一個對象(就像3是個對象),因此如果你願意的話,可以把這個函數字面量保持在一個變量中。這個變量也是一函數,因此你可以使用函數風格來調用它,比如:

scala> var increase = (x :Int ) => x +1
increase: Int => Int = <function1>

scala> increase(10)
res0: Int = 11

注意函數字面量 (x:Int) => x + 1的類型為 ,它在Scala內部表示為帶有一個參數的類Function1的一個對象,其它如FunctionN代表帶有N個參數的函數,Function0代表不含參數的函數類型。

如果函數定義需要多條語句,可以使用{},比如:

scala> var increase = (x :Int ) => {
     |    println("We")
     |    println("are")
     |    println("here")
     |    x + 1
     |    }
increase: Int => Int = <function1>

scala> increase (10)
We
are
here
res0: Int = 11

什么我們了解到了函數字面量的基本概念,它可以作為參數傳遞個其它函數,比如很多Scala的庫允許你使用函數作為參數,比如foreach方法,它使用一個函數參數,為集合中每個運算調用傳入的函數。例如:

scala> val someNumbers = List ( -11, -10, - 5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)

scala> someNumbers.foreach((x:Int) => println(x))
-11
-10
-5
0
5
10

再比如,Scala的集合也支持一個filter方法用來過濾集合中的元素,filter的參數也是一個函數,比如:

scala> someNumbers.filter( x => x >0)
res1: List[Int] = List(5, 10)

使用 x => x >0 ,過濾掉小於0 的元素。 如果你熟悉lambda表達式, x => x >0 為函數的lambda表達式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM