nutshell_Nutshell中的Java 8语言功能-第1部分
nutshell
你好朋友,
Java 8發(fā)布已經(jīng)很長時(shí)間了,現(xiàn)在越來越多地被使用。 在本文中,我們將討論以下Java 8主題。
1.功能接口
2.Lambda表達(dá)式
3.默認(rèn)方法
1.功能界面
什么是功能接口?
與一種并且只有一種抽象方法的接口是功能接口,因?yàn)樗『帽硎疽环N功能。 但是,功能接口可以具有n個(gè)默認(rèn)值以及靜態(tài)方法。
功能接口的語法
就像任何其他界面一樣。 唯一的區(qū)別是它應(yīng)該在頂部具有@FunctionalInterface批注。
@FunctionalInterface interface fly {}另外,我們需要了解的是,即使我們不使用@FunctionalInterface批注,但一個(gè)接口只有一個(gè)抽象方法,則默認(rèn)情況下該接口將被視為Functional Interface,但始終建議使用@FunctionalInterface批注用于功能界面。
放置@FunctionalInterface批注的優(yōu)點(diǎn)是,今天,您可以通過僅在其中使用一個(gè)抽象方法而不使用@FucntionalInterface批注來定義接口為“函數(shù)接口”,并牢記可以為此函數(shù)接口編寫lambda,但是如果您使用項(xiàng)目,并且有很多開發(fā)人員在該項(xiàng)目上工作,那么以后很有可能有人可以將其他方法添加到您的功能接口中,而該方法實(shí)際上將不會(huì)保留為功能接口,因?yàn)樗鼘⒕哂卸鄠€(gè)抽象方法,同時(shí),也會(huì)破壞所有已經(jīng)編寫的lambda表達(dá)式。
因此,如果您打算編寫一個(gè)可以編寫lambda的接口,則最好使用@FunctionalInterface對其進(jìn)行標(biāo)記。
功能界面的主要目的
在Java 8中引入功能接口的主要目的是允許針對功能接口編寫lambda表達(dá)式,因?yàn)橐厌槍δ芙涌诘姆椒?yàn)證了lambda表達(dá)式方法簽名。
功能界面示例
@FunctionalInterfacepublic interface Calculator {int add(int a, int b); }public class Test {public static void main(String[] args){Calculator calculator = (a,b) -> a + b;System.out.println("Sum is:"+ calculator.add(4,6));}}JDK 1.8在java.util.function包中添加了許多內(nèi)置的Functional Interface,可用于編寫lambda表達(dá)式。
謂詞
消費(fèi)者
供應(yīng)商
功能
2. Lambda表達(dá)式
Lambda表達(dá)是什么?
簡單來說,Lambda表達(dá)式是Functional Interface方法的實(shí)現(xiàn)。 通常,我們在方法中編寫實(shí)現(xiàn),但是對于lambda而言,沒有方法可以在其中編寫,因此我們可以將lambda表達(dá)式視為匿名函數(shù),即具有實(shí)現(xiàn)但沒有任何名稱的函數(shù)。
Lambda表達(dá)式的語法?
(Comma separated parameters)? + arrow symbol + single? expression or block of statements;Lambda表達(dá)的主要目的
在Java 8中引入Lambda表達(dá)式的主要原因是要在Java中啟用函數(shù)式編程。 在Java 8之前,如果我們想擁有一些要內(nèi)聯(lián)執(zhí)行的功能,例如單擊按鈕,并且將此代碼放在單獨(dú)的類中沒有意義,那么我們可以通過創(chuàng)建一個(gè)匿名類來實(shí)現(xiàn)。 在這些情況下,我們通常試圖將功能作為參數(shù)傳遞給另一種方法,例如當(dāng)某人單擊按鈕時(shí)應(yīng)采取什么措施。 匿名類的問題在于,即使我們的實(shí)現(xiàn)非常小,使用匿名類編寫的代碼也非常冗長和不清楚。 使用lambda表達(dá)式,我們可以以更具可讀性和簡潔的方式編寫代碼。
Lambda表達(dá)式示例
讓我們看看如何編寫lambda表達(dá)式。
從上面的示例中,我們有以下界面:
@FunctionalInterfacepublic interface Calculator {int?add(int a,int b);}Lambda表達(dá)式是從Functional接口的方法派生的,因此使用add方法的簽名,我們將編寫第一個(gè)Lambda表達(dá)式。 括號內(nèi)的左側(cè)是參數(shù),然后是箭頭符號,然后是語句塊。
(int a,int b) -> {return a + b;};如果仔細(xì)觀察,它就是沒有任何方法名稱的方法定義。 假設(shè)它有一個(gè)名稱,則在刪除箭頭符號后,其外觀將如下所示:
add(int a,int b) {return a?+ b;};現(xiàn)在將其轉(zhuǎn)換為Lambda時(shí),Java設(shè)計(jì)人員刪除了名稱,即在參數(shù)后添加并放置一個(gè)箭頭符號,如下所示:
(int a,int b) ->{return a?+ b;};現(xiàn)在,由于編譯器通過將lambda表達(dá)式與Functional Interface方法的簽名進(jìn)行匹配來檢查lambda表達(dá)式的簽名,因此編譯器可以通過檢查Functional Interface方法來猜測lambda表達(dá)式中傳遞的參數(shù)的類型。 因此,我們可以從參數(shù)中刪除類型,以使修改后的lambda表達(dá)式如下所示:
(a, b) -> {return a?+ b;};除了猜測參數(shù)的類型外,編譯器還將通過查看函數(shù)接口中聲明的方法的返回類型來了解該lambda表達(dá)式將返回int值,因此我們也可以刪除return關(guān)鍵字。
(a, b) -> {a?+ b;};現(xiàn)在,因?yàn)樵谏厦娴膌ambda表達(dá)式中,我們在塊中只有一個(gè)語句,所以我們也可以刪除花括號,因此修改后的lambda如下所示:
(a,b) -> a?+b;3.界面中的默認(rèn)方法
什么是默認(rèn)方法?
默認(rèn)方法是具有一些默認(rèn)實(shí)現(xiàn)的方法,可以在接口中定義。
在Java8之前,我們無法在接口中使用帶有定義的方法,但是在Java8中,我們也可以在接口中使用帶有定義的方法,但是這些都是特殊的方法,因?yàn)樗鼈兊暮灻袔в衐efault關(guān)鍵字。
引入默認(rèn)方法的主要目的
在Java中添加默認(rèn)方法的主要原因是使代碼向后兼容,即使在現(xiàn)有接口中引入了新方法,因?yàn)槿绻淮嬖谀J(rèn)方法,我們會(huì)嘗試在現(xiàn)有接口中添加新方法,它將破壞所有實(shí)現(xiàn)類,因?yàn)槟切┈F(xiàn)有的實(shí)現(xiàn)類必須在接口中實(shí)現(xiàn)新引入的方法。
默認(rèn)方法的語法
public interface InterfaceTest{default public void testDefault(){}}默認(rèn)方法示例
自從JDK 1.5在JDK 1.8版本中引入了新的默認(rèn)方法以來,就存在可迭代的接口。 現(xiàn)在,隨著Collection接口擴(kuò)展了此可迭代接口以及List等集合,Set擴(kuò)展了Collection接口,默認(rèn)情況下,此方法可用于這些集合以迭代這些集合的元素。
public interface Iterable<T> {default void forEach(Consumer<? super T>action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}}如果此方法不是默認(rèn)方法,并且已經(jīng)添加到Iterable接口,它將強(qiáng)制所有實(shí)現(xiàn)此接口的類(通過Collection接口)來實(shí)現(xiàn)此方法,因此將破壞所有這些類。 因此,為了使像forEach方法的代碼在不破壞現(xiàn)有代碼的情況下工作,JDK 1.8中引入了默認(rèn)方法。
感謝您閱讀Java 8語言功能。如果您認(rèn)為它有用,請共享它,以便其他人也可以從中受益。
翻譯自: https://www.javacodegeeks.com/2018/06/java-8-language-features-nutshell-part-1.html
nutshell
總結(jié)
以上是生活随笔為你收集整理的nutshell_Nutshell中的Java 8语言功能-第1部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内存设置为只读(linux内存
- 下一篇: jsp过滤器示例_Java 8过滤器,地