scala中的匿名函數 ==> 簡單示例


//定義一個接收消息的函數 getMsg,它有一個參數 msg 用來接收消息的內容。它的函數體是一個匿名函數,匿名函數有一個參數 name 用來接收姓名。

scala> def getMsg (msg : String) = (name : String) => println(msg + " , " + name)
getMsg: (msg: String)String => Unit

//調用函數getMsg,說 hello

scala> val msg = getMsg("hello")
msg: String => Unit = <function1>

現在得到了一個返回值,它是一個匿名函數。

//調用這個匿名函數,跟 Mike 說 hello

scala> msg("Mike")
hello , Mike

//一步到位的跟 Luffy 說 hi

scala> getMsg("hi")("Luffy")
hi , Luffy

這個例子中的函數getMsg實現了一個簡單的發送消息的功能。但是我們可以發送不同的消息內容,而且可以向不同的人發送。這就極大的擴展了函數的功能。getMsg實際上就是scala中的高階函數,它返回一個匿名函數。

將函數的定義 getMsg: (msg: String)String => Unit 分解開來:

函數名稱 :getMsg,

參數列表 :變量msg 類型為String

返回值 : String => Unit  表示一個接收String類型參數,沒有返回值的匿名函數

==============================================華麗分割線==============================================================

換一種形式來實現這個功能。

 

//定義一個打招呼的函數 sayHello,傳入一個name,表示跟誰打招呼。

scala> def sayHello (name :String) = println("hello," + name)
sayHello: (name: String)Unit

//定義一個函數 greeting,它也是一個高階函數,但它與getMsg的定義不同。它接收兩個參數:一個是匿名函數,要求這個匿名函數是一個接收String類型參數,沒有返回值的函數。另外一個參數是String類型的變量。

scala> def greeting(func :(String => Unit),name :String) = {func(name)}
greeting: (func: String => Unit, name: String)Unit

//調用函數 ,跟 Mike 打個招呼吧。

scala> greeting(sayHello,"Mike")
hello,Mike

看似現在功能不如gegMsg強大吖。只能說hello,不能說別的了?

其實並不是。這個函數的功能可能更大強大,因為它可以接收任意的一個符合它參數定義的匿名函數作為參數。比如,我們可以定義一個說hi的函數

//定義另外一個打招呼的函數

scala> def sayHi(name :String) = println("hi," + name)
sayHi: (name: String)Unit

//調用這個函數跟 Mike 說 hi 吧

scala> greeting(sayHi,"Mike")
hi,Mike

也就是說,只要一個函數符合 String => Unit 這個定義,它就可以作為參數傳入到greeting中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM