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