iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
自我挑戰組

連續30天 初學者介紹Scala語言系列 第 12

[Day 12]Scala 函式與閉包 Part 2

  • 分享至 

  • xImage
  •  
  • First-class functions
  • Placeholder syntax

今天繼續來談函式
在Scala裡有一級函式(Fisrt-class function) 的概念,即我們可以把函式定義成一個匿名常量(unnamed literal),並且把它當成值傳遞。
舉例來說:

val max = (x: Int, y: Int) => if (x > y) x else y 

這是一個判斷大小的函式常量
=>左邊定義函式的參數和類型,右邊是函式的內容
函式常量(function literal)被編譯成類別,並在程式執行時實體化成函式值。

要區分函式常量和函式值在於前者存在於source code中,而後者以物件的形式存在與每次執行期間。
另外,
函式值是物件,所以可以把它們存在變數中。
函式值也是函式,所以也可以用一般呼叫函式那樣呼叫它們。

下面列出兩種函式值的操作:

var increment = (x: Int) => x + 10
increment(60)    //Output = 70
val names = List("Maverick", "Goose", "rooster")
names.foreach((x: String) => println(x))    
//Output = 
//Maverick
//Goose
//rooster

再舉一個常見的例子,也就是filter

names.filter((x: String) => x.length > 7)
//Output = Maverick

以上面的例子為例,如果用簡寫形式來寫的話,我們知道Scala有型別推斷的功能,所以我們可以省略參數的類型不寫

names.filter((x) => x.length > 7)

另外如果是靠型別推斷而來的話,我們也可以省略參數的括號不寫

names.filter(x => x.length > 7)

為了讓函式常量的寫法更為精簡,我們也可以用底線(underscore)來表示一個或多個參數,只要這些參數在函式常量中只會出現一次即可。
舉例:

names.filter(_. > 7)
//List[String] = List("Maverick")

底線(underscore)在這邊就類似一個空格
函式每次呼叫時這個空格就會被填入一個引數
上面的例子是每次呼叫filter時就會有個名字會被丟入到空格,來判斷它的長度有沒有大於7

今天先介紹到這邊 明天繼續
/images/emoticon/emoticon46.gif


上一篇
[Day 11]Scala 函式與閉包
下一篇
[Day 13]Scala 函式與閉包 Part3
系列文
連續30天 初學者介紹Scala語言30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言