JDK8出來已經很久了,剛出來的時候稍微了解了一下,後面就丟棄了,現在重新拾取。雖然現在JDK11了。
本文將以持續更新模式進行。
直接看程式碼,在java8新特性裡,我們可以這樣寫:
public static void main(String[] args) { Supplier<Integer> supplier = ()->1; Consumer<String> consumer = (a)-> System.out.println(a); System.out.println(supplier.get()); consumer.accept("test"); }
輸出:
1 test Process finished with exit code 0
很洋氣。如此簡潔的程式碼,你行嗎,對就是說的你java7
先盜一張圖過來,說明一下Lambda
也就是說, Lambda表達式,創建了一個對應介面的實現,然後賦值給變數,是不是利用編譯器?查看編譯後的程式碼如下:
public static void main(String[] args) { Supplier<Integer> supplier = () -> { return 1; }; Consumer<String> consumer = (a) -> { System.out.println(a); }; System.out.println(supplier.get()); consumer.accept("test"); }
編譯器並沒有做這個功能,那就可能是JVM實作了Lambda的功能,後期再深入了解一下。標記1
寫到這裡,可以知道Lambda表達式減少了程式碼量,在java8之前只能用匿名內部類別或建立一個類別實作該介面實作該功能。如下
Supplier<Integer> supplier = new Supplier<Integer>() { @Override public Integer get() { return 1; } };
實際上,我比較好奇伴隨Lambda的接口,打開源碼可以看到
@FunctionalInterface public interface Supplier<T> { /** * Gets a result. * * @return a result */ T get(); }
对应的接口都添加了注解FunctionalInterface,那么不要这个注解是否能实现Lambda表达式,我做了一些测试,发现不需要注解也可以实现,目前来看注解只有两个功能 1、表示这个接口是函数式接口 2、帮助编译器识别,接口不能有多个方法。 在有多个方法的时候会提示Multiple non-overriding abstract methods found in interface
現在我們可以透過FunctionalInterface來查找在JDK8裡面有哪些接口是函數式接口
我從裡面選一兩個比較熱門的來測試,學習
#哦,先打斷一下剛看文章看到一段很重要的話(在實務中,函數式介面非常脆弱:只要某個開發者在該介面中加入一個函數,則該介面就不再是函數式介面進而導致編譯失敗。為了克服這種程式碼層面的脆弱性,並明確說明某個接口是函數式接口,Java 8 提供了一個特殊的註解)
我選的是ArrayList和Optional兩個類,都是很常用的類。
相關文章:
#相關影片:
#
以上是Java中對Lambda表達式的理解,來測試學習一下的詳細內容。更多資訊請關注PHP中文網其他相關文章!