3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
我們是否使用 lambda 中的 CheckPerson 接口?
我們不使用它,我們定義它。我們給它一個(gè)實(shí)現(xiàn)。我們通過(guò)編寫 lambda 表達(dá)式來(lái)實(shí)現(xiàn)該接口。
“in lambda”是你的誤解,因?yàn)?lambda是該接口的一個(gè)實(shí)例。
他們說(shuō)他們省略了方法,我在 lambda 中看不到任何測(cè)試——這很清楚。但他們也放棄了接口 CheckPerson 的名稱。
這不是關(guān)于“丟棄”或“省略”某些東西。它是關(guān)于用另一種語(yǔ)法結(jié)構(gòu)替換一種語(yǔ)法結(jié)構(gòu)。您將匿名類替換為 lambda 表達(dá)式,以使您的代碼更具表現(xiàn)力且更簡(jiǎn)潔。

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
它在 Java 中稱為 SAM(單一抽象方法)類型,是的,仍然使用接口。
讓我們看一下 的簽名printPersons
:
public static void printPersons(List<Person> roster, CheckPerson tester)
因此,Java 編譯器知道,如果您為其提供 lambda,則該 lambda 應(yīng)該遵守CheckPerson
提供的單個(gè)方法。

TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
出于所有意圖和目的,lambda 表達(dá)式是一種語(yǔ)法糖,用于簡(jiǎn)化編寫匿名類的方式。
這并不完全正確,因?yàn)榫幾g器實(shí)際上并沒(méi)有生成匿名類(盡管它可以生成),并且關(guān)鍵字之類的東西會(huì)this改變含義,但在其他方面它確實(shí)非常相似。
所以,使用匿名類的代碼是:
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
現(xiàn)在,由于編譯器知道 的第二個(gè)參數(shù)printPersons必須是一個(gè)CheckPerson對(duì)象,它可以在看到 lambda 表達(dá)式時(shí)推斷出這一點(diǎn)。由于接口只有一個(gè)方法,它也可以推斷出你需要實(shí)現(xiàn)這樣一個(gè)方法。
但是,您仍然必須列出參數(shù),這意味著如果您刪除可以從前兩行推斷出的所有內(nèi)容:
new CheckPerson() {
public boolean test(Person p) {
你得到:
(Person p) -> {
其中->是告訴編譯器推斷其余部分的 lambda 表達(dá)式語(yǔ)法。
到目前為止,我們已經(jīng)減少了:
new CheckPerson() {
public boolean test(Person p) {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
}
到:
(Person p) -> {
return p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25;
}
現(xiàn)在我們應(yīng)用更多的語(yǔ)法糖,即讓編譯器做更多的工作,以刪除“模板”的東西。
參數(shù)類型可以推斷出來(lái),所以不需要給出。
如果只有一個(gè)參數(shù),則不需要()括號(hào)。
如果方法中唯一的語(yǔ)句是return語(yǔ)句,則刪除{}大括號(hào)、return關(guān)鍵字和;分號(hào),只留下普通表達(dá)式。
結(jié)果:
p -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
這是簡(jiǎn)寫 lambda 表達(dá)式(語(yǔ)法糖),用于執(zhí)行與原始匿名類相同的操作。
添加回答
舉報(bào)