3 回答

TA貢獻1828條經驗 獲得超3個贊
我們是否使用 lambda 中的 CheckPerson 接口?
我們不使用它,我們定義它。我們給它一個實現。我們通過編寫 lambda 表達式來實現該接口。
“in lambda”是你的誤解,因為 lambda是該接口的一個實例。
他們說他們省略了方法,我在 lambda 中看不到任何測試——這很清楚。但他們也放棄了接口 CheckPerson 的名稱。
這不是關于“丟棄”或“省略”某些東西。它是關于用另一種語法結構替換一種語法結構。您將匿名類替換為 lambda 表達式,以使您的代碼更具表現力且更簡潔。

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

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