Scala允許我們將函數(shù)表達(dá)為文字。
函數(shù)文字允許我們有一個(gè)函數(shù)類(lèi)型的表達(dá)式,我們可以寫(xiě)一個(gè)短格式,而不聲明它的名稱(chēng)。
函數(shù)類(lèi)型可以是以下之一:
函數(shù)常量以括號(hào)括起來(lái)的逗號(hào)分隔的參數(shù)列表開(kāi)頭,后跟箭頭和函數(shù)體。
函數(shù)常量也稱(chēng)為匿名函數(shù)。
考慮一個(gè)add函數(shù):
val add = (x: Int, y: Int) => x + y
使用函數(shù)常量,您可以定義添加函數(shù),如下所示:
(x: Int, y: Int) => x + y.
函數(shù)常量被實(shí)例化為稱(chēng)為函數(shù)值的對(duì)象。
函數(shù)對(duì)象擴(kuò)展FunctionN traits中的一個(gè),例如Function0,F(xiàn)unction1等等直到Function22。
根據(jù)函數(shù)中的參數(shù)數(shù)量,相應(yīng)的FunctionN trait由編譯器選擇。
對(duì)于具有兩個(gè)參數(shù)的函數(shù),編譯器選擇Function2作為底層類(lèi)型。對(duì)于具有3個(gè)參數(shù)的函數(shù),編譯器選擇Function3,對(duì)于具有4個(gè)參數(shù)的函數(shù),F(xiàn)unction4等。
因?yàn)楹瘮?shù)值是一個(gè)對(duì)象,它可以存儲(chǔ)在一個(gè)變量中,它可以使用括號(hào)函數(shù)調(diào)用來(lái)調(diào)用,如下所示:
object Main extends App { val add = (a: Int, b: Int) => a + b println(add(1, 2)); }
Scala函數(shù)是對(duì)象。
在函數(shù)式編程中,函數(shù)是一等公民函數(shù)。 一等公民函數(shù)可以
將函數(shù)作為參數(shù)或返回函數(shù)的函數(shù)稱(chēng)為高階函數(shù)。
正如我們可以傳遞String,Int和其他變量一樣,我們可以像一個(gè)變量一樣傳遞一個(gè)函數(shù)。
我們可以定義一個(gè)函數(shù)常量,然后將該常量賦值給一個(gè)變量。
以下代碼定義了一個(gè)函數(shù)常量,它接受一個(gè)I??nt參數(shù),并返回一個(gè)值,該值是傳遞的Int的兩倍:
(i: Int) => { i * 2 }
我們現(xiàn)在可以將該函數(shù)常量分配給一個(gè)變量:
val doubler = (i: Int) => { i * 2 }
變量doubler
是一個(gè)函數(shù)的實(shí)例,稱(chēng)為函數(shù)值。
我們現(xiàn)在可以調(diào)用doubler,如下所示:
doubler(2)
doubler
是Function1 trait的一個(gè)實(shí)例,它定義了一個(gè)接受一個(gè)參數(shù)的函數(shù)。
doubler
是使用關(guān)鍵字 val
創(chuàng)建并分配給變量的函數(shù)。
我們可以創(chuàng)建一個(gè)函數(shù)或一個(gè)方法,它將一個(gè)函數(shù)作為參數(shù)。
為此,首先定義一個(gè)將函數(shù)作為參數(shù)的方法。
def operation(functionparam:(Int, Int) => Int) { println(functionparam(4,4)) }
操作方法使用一個(gè)名為functionparam的參數(shù),它是一個(gè)函數(shù)。
functionparam函數(shù)接受兩個(gè)Int并返回一個(gè) Int
。
操作方法返回一個(gè)Unit,指示操作方法不返回任何內(nèi)容。
接下來(lái),定義一個(gè)與預(yù)期簽名匹配的函數(shù)。以下add函數(shù)匹配該簽名,因?yàn)樗枰獌蓚€(gè)Int參數(shù)并返回Int:
val add = (x: Int, y:Int) => { x + y }
現(xiàn)在我們可以將一個(gè)add函數(shù)傳遞給操作方法:
object Main extends App { def operation(functionparam:(Int, Int) => Int) { println(functionparam(4,4)) } val add = (x: Int, y:Int) => { x + y } operation(add) }
任何匹配此簽名的函數(shù)都可以傳遞到操作方法中。
object Main extends App { def operation(functionparam:(Int, Int) => Int) { println(functionparam(4,4)) } val add = (x: Int, y:Int) => { x + y } operation(add) val subtract = (x: Int, y:Int) => { x - y } val multiply = (x: Int, y:Int) => { x*y } operation(subtract) operation(multiply) }
我們可以從函數(shù)或方法返回一個(gè)函數(shù)。
為了做到這一點(diǎn),首先定義一個(gè)匿名函數(shù)。下面的代碼聲明一個(gè)匿名函數(shù),它接受一個(gè)String參數(shù)并返回一個(gè)String:
(name: String) => { "hello" + " " + name }
現(xiàn)在我們將定義一個(gè)方法來(lái)返回我們剛才定義的匿名函數(shù)。
def greeting() = (name: String) => {"hello" + " " + name}
在=符號(hào)的左側(cè)有一個(gè)正常的方法聲明:
def greeting()
在右邊的是一個(gè)函數(shù)文字:
def greeting() = (name: String) => {"hello" + " " + name}
現(xiàn)在你可以將greeting()賦給一個(gè)變量:
val greet= greeting()
因?yàn)槟涿瘮?shù)接受一個(gè)String參數(shù)名,我們可以傳遞一個(gè)名字:
object Main extends App { def greeting() = (name: String) => {"hello" + " " + name} val greet= greeting() println(greet("Scala")) }
更多建議: