日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

nutshell_Nutshell中的Java 8语言功能-第1部分

發(fā)布時(shí)間:2023/12/3 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nutshell_Nutshell中的Java 8语言功能-第1部分 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。