Nutshell中的Java 8语言功能-第1部分
你好朋友,
Java 8發(fā)布已經(jīng)很長時間了,現(xiàn)在越來越多地被使用。 在本文中,我們將討論以下Java 8主題。
1.功能接口
2,Lambda表達式
3.默認方法
1.功能界面
什么是功能接口?
與一種并且只有一種抽象方法的接口是功能接口,因為它恰好表示一種功能。 但是,功能接口可以具有n個默認值以及靜態(tài)方法。
功能接口的語法
就像其他任何界面一樣。 唯一的區(qū)別是它應該在頂部具有@FunctionalInterface批注。
@FunctionalInterface interface fly {}此外,我們需要了解,即使我們不使用@FunctionalInterface批注,但是一個接口只有一個抽象方法,則默認情況下該接口將被視為Functional Interface,但始終建議使用@FunctionalInterface批注用于功能界面。
放置@FunctionalInterface批注的好處是,今天,您可以通過僅在其中使用一種抽象方法而不使用@FucntionalInterface批注來定義接口為“函數(shù)接口”,并牢記可以為此函數(shù)接口編寫lambda,但是如果您使用一個項目,并且有很多開發(fā)人員在該項目上工作,那么以后很有可能有人可以向您的功能接口添加另一種方法,該方法實際上將不會保留為功能接口,因為它將具有多個抽象方法,同時,也會破壞所有已經(jīng)編寫的lambda表達式。
因此,如果您打算編寫一個可以使用其編寫lambda的接口,則最好使用@FunctionalInterface對其進行標記。
功能界面的主要目的
在Java 8中引入功能接口的主要目的是允許針對功能接口編寫lambda表達式,因為針對功能接口的方法驗證了lambda表達式方法簽名。
功能界面示例
@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表達式。
謂語
消費者
供應商
功能
2. Lambda表達式
Lambda表達是什么?
簡單地說,Lambda表達式是功能接口方法的實現(xiàn)。 通常,我們在方法中編寫實現(xiàn),但是在使用lambda的情況下,沒有編寫方法的編寫,因此我們可以將lambda表達式視為匿名函數(shù),即具有實現(xiàn)但沒有任何名稱的函數(shù)。
Lambda表達式的語法?
(Comma separated parameters)? + arrow symbol + single? expression or block of statements;Lambda表達的主要目的
在Java 8中引入Lambda表達式的主要原因是要在Java中啟用函數(shù)式編程。 在Java 8之前,如果我們想擁有一些要內(nèi)聯(lián)執(zhí)行的功能,例如單擊按鈕,并且將此代碼放在單獨的類中沒有意義,那么我們可以通過創(chuàng)建一個匿名類來實現(xiàn)。 在這些情況下,我們通常試圖將功能作為參數(shù)傳遞給另一種方法,例如當某人單擊按鈕時應采取什么措施。 匿名類的問題在于,即使我們的實現(xiàn)非常小,使用匿名類編寫的代碼也非常冗長和不清楚。 使用lambda表達式,我們可以以更具可讀性和簡潔的方式編寫代碼。
Lambda表達式示例
讓我們看看如何編寫lambda表達式。
從上面的示例中,我們有以下界面:
@FunctionalInterfacepublic interface Calculator {int?add(int a,int b);}Lambda表達式是從Functional接口的方法派生的,因此使用add方法的簽名,我們將編寫第一個Lambda表達式。 括號內(nèi)的左側(cè)是參數(shù),然后是箭頭符號,然后是一個語句塊。
(int a,int b) -> {return a + b;};如果仔細觀察,它是沒有任何方法名稱的方法定義。 假設它有一個名稱,然后在刪除箭頭符號后將如下所示:
add(int a,int b) {return a?+ b;};現(xiàn)在將其轉(zhuǎn)換為Lambda時,Java設計人員刪除了名稱,即在參數(shù)后添加箭頭符號,使它變?yōu)槿缦滤?#xff1a;
(int a,int b) ->{return a?+ b;};現(xiàn)在,由于編譯器通過將lambda表達式的簽名與Functional Interface方法的簽名進行匹配來檢查lambda表達式的簽名,因此,編譯器可以通過檢查Functional Interface方法來猜測lambda表達式中傳遞的參數(shù)的類型。 因此,我們可以從參數(shù)中刪除類型,以便修改后的lambda表達式如下所示:
(a, b) -> {return a?+ b;};除了猜測參數(shù)的類型之外,編譯器還將通過查看函數(shù)接口中聲明的方法的返回類型來了解該lambda表達式將返回int值,因此我們也可以刪除return關(guān)鍵字。
(a, b) -> {a?+ b;};現(xiàn)在,因為在上面的lambda表達式中,我們在塊中只有一個語句,所以我們也可以刪除花括號,因此修改后的lambda如下所示:
(a,b) -> a?+b;3.界面中的默認方法
什么是默認方法?
默認方法是具有一些默認實現(xiàn)的方法,可以在接口中定義。
在Java8之前,我們無法在接口中使用帶有定義的方法,但是在Java8中,我們也可以在接口中使用帶有定義的方法,但是這些都是特殊的方法,因為它們的簽名中帶有default關(guān)鍵字。 。
引入默認方法的主要目的
在Java中添加默認方法的主要原因是使代碼向后兼容,即使在現(xiàn)有接口中引入了新方法時也是如此,因為如果不存在默認方法,我們將嘗試在現(xiàn)有接口中添加新方法,它將破壞所有實現(xiàn)類,因為那些現(xiàn)有的實現(xiàn)類必須在接口中實現(xiàn)新引入的方法。
默認方法的語法
public interface InterfaceTest{default public void testDefault(){}}默認方法示例
自JDK 1.5以來,JDK 1.8版本中就遵循了默認的新方法,從而提供了可迭代的接口。 現(xiàn)在,隨著Collection接口擴展了此可迭代接口以及List等集合,Set擴展了Collection接口,此方法默認情況下可用于這些集合以迭代這些集合的元素。
public interface Iterable<T> {default void forEach(Consumer<? super T>action) {Objects.requireNonNull(action);for (T t : this) {action.accept(t);}}}如果該方法不是默認方法,并且已經(jīng)添加到Iterable接口,它將強制所有實現(xiàn)此接口的類(通過Collection接口)來實現(xiàn)此方法,因此將破壞所有這些類。 因此,為了在不破壞現(xiàn)有代碼的情況下使類似于forEach方法的代碼起作用,JDK 1.8中引入了默認方法。
感謝您閱讀Java 8語言功能。如果您認為它有用,請共享它,以便其他人也可以從中受益。
翻譯自: https://www.javacodegeeks.com/2018/06/java-8-language-features-nutshell-part-1.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Nutshell中的Java 8语言功能-第1部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 存钱超过5万备案(存5万备案)
- 下一篇: linux rm 文件夹(linux r