Scala函式字面量

2021-09-07 06:07:30 字數 1253 閱讀 9306

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

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

scala> var increase = (x :int ) => x +1

increase: int => int = scala> increase(10)

res0: int = 11

注意函式字面量 (x:int) => x + 1的型別為 ,它在scala內部表示為帶有乙個引數的類function1的乙個物件,其它如functionn代表帶有n個引數的函式,function0代表不含引數的函式型別。

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

scala> var increase = (x :int ) => 

increase: int => int = scala> increase (10)

weare

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-50

510

再比如,scala的集合也支援乙個filter方法用來過濾集合中的元素,filter的引數也是乙個函式,比如:

scala> somenumbers.filter( x => x >0)

res1: list[int] = list(5, 10)

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

Scala函式字面量簡化寫法

scala提供了多種方法來簡化函式字面量中多餘的部分,比如前面例子中filter方法中使用的函式字面量,完整的寫法如下 x int x 1首先可以省略到引數的型別,scala可以根據上下文推算出引數的型別,函式定義可以簡化為 x x 1這個函式可以進一步去掉引數的括號,這裡的括號不起什麼作用 x x...

字面量和整數字面量

字面量是指c c 源 中直接使用的常量,字面量的意思是 一眼看上去是什麼就是什麼 例如語句 int x 10 中10就是字面量,它相對於變數,只有乙個確定的值不能改變,這個值就是它看上去的值。c c 中的字面量有一下幾種 1.0和正整數,如10 123等 負整數不是字面量,因為加了 運算子 2.浮點...

scala 函式字面量 閉包 3種函式引數形式

函式字面量 就是乙個函式作為表示式使用,有匿名函式的意思def m x int x 1 println m 1 閉包 簡單說就是函式字面量 自由變數 在執行時,捕獲自由變數,從這個函式字面量建立出函式物件 函式值 叫做閉包 例子1 這個函式是建立並返回閉包的函式 每呼叫一次,就會產生乙個閉包 這裡的...