lambda表達(dá)式本質(zhì)上是一個(gè)匿名函數(shù),java中l(wèi)ambda表達(dá)式是從接口擴(kuò)展而來(lái)澎迎,但對(duì)接口方法有嚴(yán)格要求,它要求在實(shí)現(xiàn)Lambda表達(dá)式的接口中只有一個(gè)抽象方法。這個(gè)方法稱為sam(single abstract method),即單個(gè)抽象方法孵稽,能夠使用Lambda表達(dá)式的接口稱為“功能性接口”许起,如何對(duì)“功能性”接口進(jìn)行語(yǔ)法檢查,加一個(gè)注解@FunctionInterface菩鲜。Scala中l(wèi)ambda表達(dá)式是一等公民园细,有def這樣的高級(jí)類型接口,所以可以隨意使用
- 在Scala中一個(gè)函數(shù)文本寫成如下形式:
(argument) => //funtion body
eg: 計(jì)算兩個(gè)字符串長(zhǎng)度差 :
(s1: String, s2 :String) => s1.length - s2.length
Scala中的函數(shù)文本也是閉包接校。它可以訪問在直接詞法作用域之外定義的變量猛频。
val outer =10
val myFuncLiteral = (y: Int) => y * outer
val result = myFuncLiteral(2)
> 20
我們將函數(shù)文本分配給了變量 myFuncLiteral。
java 8 的lambda表達(dá)式和Scala的函數(shù)文本在語(yǔ)法和語(yǔ)義上的相似性是十分明顯的蛛勉。從語(yǔ)義上講它們是相同的鹿寻,而語(yǔ)法上的唯一不同就是箭頭符號(hào)(java8 ->, scala =>)和沒有提到的簡(jiǎn)化符號(hào)。