鍍金池/ 教程/ Scala/ 函數(shù)–頭等公民
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實現(xiàn)方法
try 表達式處理異常
選擇瘦接口還是胖接口設(shè)計?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實現(xiàn)可疊加的修改操作

函數(shù)–頭等公民

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

(x :Int ) => x +1

這是個函數(shù)字面量,它的功能為+1. 符好 => 表示這個函數(shù)將符號左邊的東西(本例為一個整數(shù)),轉(zhuǎn)換成符號右邊的東西(加 1)。

函數(shù)字面量為一個對象(就像 3 是個對象),因此如果你愿意的話,可以把這個函數(shù)字面量保持在一個變量中。這個變量也是一函數(shù),因此你可以使用函數(shù)風(fēng)格來調(diào)用它,比如:

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

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

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

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

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

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 的參數(shù)也是一個函數(shù),比如:

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

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