nutshell_Nutshell中的Java 8语言功能-第1部分
nutshell
你好朋友,
Java 8發布已經很長時間了,現在越來越多地被使用。 在本文中,我們將討論以下Java 8主題。
1.功能接口
2.Lambda表達式
3.默認方法
1.功能界面
什么是功能接口?
與一種并且只有一種抽象方法的接口是功能接口,因為它恰好表示一種功能。 但是,功能接口可以具有n個默認值以及靜態方法。
功能接口的語法
就像任何其他界面一樣。 唯一的區別是它應該在頂部具有@FunctionalInterface批注。
@FunctionalInterface interface fly {}另外,我們需要了解的是,即使我們不使用@FunctionalInterface批注,但一個接口只有一個抽象方法,則默認情況下該接口將被視為Functional Interface,但始終建議使用@FunctionalInterface批注用于功能界面。
放置@FunctionalInterface批注的優點是,今天,您可以通過僅在其中使用一個抽象方法而不使用@FucntionalInterface批注來定義接口為“函數接口”,并牢記可以為此函數接口編寫lambda,但是如果您使用項目,并且有很多開發人員在該項目上工作,那么以后很有可能有人可以將其他方法添加到您的功能接口中,而該方法實際上將不會保留為功能接口,因為它將具有多個抽象方法,同時,也會破壞所有已經編寫的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包中添加了許多內置的Functional Interface,可用于編寫lambda表達式。
謂詞
消費者
供應商
功能
2. Lambda表達式
Lambda表達是什么?
簡單來說,Lambda表達式是Functional Interface方法的實現。 通常,我們在方法中編寫實現,但是對于lambda而言,沒有方法可以在其中編寫,因此我們可以將lambda表達式視為匿名函數,即具有實現但沒有任何名稱的函數。
Lambda表達式的語法?
(Comma separated parameters)? + arrow symbol + single? expression or block of statements;Lambda表達的主要目的
在Java 8中引入Lambda表達式的主要原因是要在Java中啟用函數式編程。 在Java 8之前,如果我們想擁有一些要內聯執行的功能,例如單擊按鈕,并且將此代碼放在單獨的類中沒有意義,那么我們可以通過創建一個匿名類來實現。 在這些情況下,我們通常試圖將功能作為參數傳遞給另一種方法,例如當某人單擊按鈕時應采取什么措施。 匿名類的問題在于,即使我們的實現非常小,使用匿名類編寫的代碼也非常冗長和不清楚。 使用lambda表達式,我們可以以更具可讀性和簡潔的方式編寫代碼。
Lambda表達式示例
讓我們看看如何編寫lambda表達式。
從上面的示例中,我們有以下界面:
@FunctionalInterfacepublic interface Calculator {int?add(int a,int b);}Lambda表達式是從Functional接口的方法派生的,因此使用add方法的簽名,我們將編寫第一個Lambda表達式。 括號內的左側是參數,然后是箭頭符號,然后是語句塊。
(int a,int b) -> {return a + b;};如果仔細觀察,它就是沒有任何方法名稱的方法定義。 假設它有一個名稱,則在刪除箭頭符號后,其外觀將如下所示:
add(int a,int b) {return a?+ b;};現在將其轉換為Lambda時,Java設計人員刪除了名稱,即在參數后添加并放置一個箭頭符號,如下所示:
(int a,int b) ->{return a?+ b;};現在,由于編譯器通過將lambda表達式與Functional Interface方法的簽名進行匹配來檢查lambda表達式的簽名,因此編譯器可以通過檢查Functional Interface方法來猜測lambda表達式中傳遞的參數的類型。 因此,我們可以從參數中刪除類型,以使修改后的lambda表達式如下所示:
(a, b) -> {return a?+ b;};除了猜測參數的類型外,編譯器還將通過查看函數接口中聲明的方法的返回類型來了解該lambda表達式將返回int值,因此我們也可以刪除return關鍵字。
(a, b) -> {a?+ b;};現在,因為在上面的lambda表達式中,我們在塊中只有一個語句,所以我們也可以刪除花括號,因此修改后的lambda如下所示:
(a,b) -> a?+b;3.界面中的默認方法
什么是默認方法?
默認方法是具有一些默認實現的方法,可以在接口中定義。
在Java8之前,我們無法在接口中使用帶有定義的方法,但是在Java8中,我們也可以在接口中使用帶有定義的方法,但是這些都是特殊的方法,因為它們的簽名中帶有default關鍵字。
引入默認方法的主要目的
在Java中添加默認方法的主要原因是使代碼向后兼容,即使在現有接口中引入了新方法,因為如果不存在默認方法,我們會嘗試在現有接口中添加新方法,它將破壞所有實現類,因為那些現有的實現類必須在接口中實現新引入的方法。
默認方法的語法
public interface InterfaceTest{default public void testDefault(){}}默認方法示例
自從JDK 1.5在JDK 1.8版本中引入了新的默認方法以來,就存在可迭代的接口。 現在,隨著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);}}}如果此方法不是默認方法,并且已經添加到Iterable接口,它將強制所有實現此接口的類(通過Collection接口)來實現此方法,因此將破壞所有這些類。 因此,為了使像forEach方法的代碼在不破壞現有代碼的情況下工作,JDK 1.8中引入了默認方法。
感謝您閱讀Java 8語言功能。如果您認為它有用,請共享它,以便其他人也可以從中受益。
翻譯自: https://www.javacodegeeks.com/2018/06/java-8-language-features-nutshell-part-1.html
nutshell
總結
以上是生活随笔為你收集整理的nutshell_Nutshell中的Java 8语言功能-第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Linux内存设置为只读(linux内存
 - 下一篇: .cs文件怎么生成dll文件(dll文件