首頁 > Java > java教程 > 主體

Java中對Lambda表達式的理解,來測試學習一下

php是最好的语言
發布: 2018-08-01 12:03:07
原創
2238 人瀏覽過

閒聊:

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

Java中對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中對Lambda表達式的理解,來測試學習一下

我從裡面選一兩個比較熱門的來測試,學習

#哦,先打斷一下剛看文章看到一段很重要的話(在實務中,函數式介面非常脆弱:只要某個開發者在該介面中加入一個函數,則該介面就不再是函數式介面進而導致編譯失敗。為了克服這種程式碼層面的脆弱性,並明確說明某個接口是函數式接口,Java 8 提供了一個特殊的註解)

我選的是ArrayList和Optional兩個類,都是很常用的類。

相關文章:

深入理解Java中的Lambda表達式

Java Lambda表達式初探

#相關影片:

JavaScript正規表示式影片教學


 

#

以上是Java中對Lambda表達式的理解,來測試學習一下的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板