Scala 基礎(7)—— 函數字面量和一等函數

1. 函數字面量html

在 Scala 基礎(3)—— 基礎類型和基礎操做 中提到了函數字面量,這裏具體解釋函數字面量的語法。java

下面展現一個具體的函數字面量,它由三部分組成:數組

(x: Int, y: Int) => x + y
  • 圓括號內部的參數列表
  • 右箭頭
  • 函數體

 

2. 一等函數函數

一等函數能夠說是 Scala 中很是重要的特性。post

所謂一等函數,就是使用函數字面量,將其做爲值進行傳遞。優化

函數字面量會被編譯成類,而且在運行時實例化成函數值,作一個簡單的類比:url

  • 函數字面量 -> 類
  • 函數值 -> 對象

 

一等函數在 Scala 的代碼中被普遍的應用,例如集成在集合類中的 foreach 和 filter 方法。spa

 

foreach 被用來遍歷集合,相比於 for 表達式,這是一種更加偏向於函數式表達的語法:htm

  def main(args: Array[String]): Unit = {
    val list = List(1, 2, 3)
    list.foreach((x: Int) => println(x))
  }

foreach 方法的入參就是一個函數字面量,其類型是 Int => Unit對象

 

filter 被用來篩選出集合中知足指定條件的元素:

  def main(args: Array[String]): Unit = {
    val list = List(1, 2, 3)
    list.filter((x: Int) => x > 0)
  }

filter 方法的參數類型是 Int => Boolean

 

3. 簡寫函數字面量

在上述 filter 的例子中,函數字面量的寫法其實能夠進一步優化。

list.filter((x: Int) => x > 0)

 

首先,編譯器知道 x 一定是整數,由於這是一個過濾一個由整數組成的列表。咱們稱 Int 爲目標類型(target typing)。

所以,能夠依靠類型推斷來略去參數類型的聲明:

list.filter((x) => x > 0)

 

其次,這個類型推斷參數兩側的括號也能夠省去:

list.filter(x => x > 0)
相關文章
相關標籤/搜索