回顧上一節的這個範例
val doubledInts = ints.map((i: Int) => i * 2)
我們注意到表達式的這個部分是匿名函數
(i: Int) => i * 2
它之所以被稱為匿名,是因為它未指定給變數,因此沒有名稱。
不過,匿名函數(也稱為函數文字)可以指定給變數以建立函數變數
val double = (i: Int) => i * 2
這會建立一個名為 double
的函數變數。在此表達式中,原始函數文字位於 =
符號的右側
val double = (i: Int) => i * 2
-----------------
新的變數名稱位於左側
val double = (i: Int) => i * 2
------
而函數的參數清單在此處以底線標示
val double = (i: Int) => i * 2
--------
如同方法的參數清單,這表示 double
函數需要一個參數,一個名為 i
的 Int
。您可以在 REPL 中看到 double
的類型為 Int => Int
,表示它需要一個 Int
參數並傳回一個 Int
scala> val double = (i: Int) => i * 2
val double: Int => Int = ...
呼叫函數
現在您可以這樣呼叫 double
函數
val x = double(2) // 4
您也可以將 double
傳遞到 map
呼叫中
List(1, 2, 3).map(double) // List(2, 4, 6)
此外,當您有其他函數類型為 Int => Int
時
val triple = (i: Int) => i * 3
您可以將它們儲存在 List
或 Map
中
val functionList = List(double, triple)
val functionMap = Map(
"2x" -> double,
"3x" -> triple
)
如果您將這些表達式貼到 REPL 中,您會看到它們有這些類型
// a List that contains functions of the type `Int => Int`
functionList: List[Int => Int]
// a Map whose keys have the type `String`, and whose
// values have the type `Int => Int`
functionMap: Map[String, Int => Int]
重點
這裡重要的部分是
- 若要建立函數變數,只要將變數名稱指定給函數文字
- 一旦您有了函數,您可以將它視為任何其他變數,例如,視為
String
或Int
變數
而且,感謝 Scala 3 中改良的 Eta Expansion 功能,您可以用相同的方式處理方法。
此頁面的貢獻者
內容
- 簡介
- Scala 功能
- 為什麼選擇 Scala 3?
- Scala 體驗
- Hello, World!
- REPL
- 變數和資料類型
- 控制結構
- 網域建模
- 方法
- 一級函數
- 單例物件
- 集合
- 脈絡抽象
- 頂層定義
- 摘要
- 類型初探
- 字串內插
- 控制結構
- 網域建模
- 工具
- OOP 建模
- FP 建模
- 方法
- 方法功能
- Scala 3 中的 Main 方法
- 摘要
- 函數
- 匿名函數
- 函數變數
- Eta Expansion
- 高階函數
- 撰寫您自己的 map 方法
- 建立會傳回函數的方法
- 摘要
- 封裝和匯入
- Scala 集合
- 集合類型
- 集合方法
- 摘要
- 函數式程式設計
- 什麼是函數式程式設計?
- 不可變值
- 純函數
- 函數是值
- 函數式錯誤處理
- 摘要
- 類型和類型系統
- 推論類型
- 泛型
- 交集類型
- 聯集類型
- 代數資料類型
- 變異性
- 不透明類型
- 結構類型
- 依賴函數類型
- 其他類型
- 脈絡抽象
- 擴充方法
- 內容參數
- 內容界限
- 已提供輸入
- 類型類別
- 多重宇宙等式
- 隱式轉換
- 摘要
- 並行處理
- Scala 工具
- 使用 sbt 建置和測試 Scala 專案
- 工作表
- 與 Java 互動
- Java 開發人員的 Scala
- JavaScript 開發人員的 Scala
- Python 開發人員的 Scala
- 接下來的去處