首頁  >  文章  >  Java  >  淺析Java8中Lambda表達式:為什麼要使用Lambda表達式?

淺析Java8中Lambda表達式:為什麼要使用Lambda表達式?

不言
不言原創
2018-09-21 11:07:393384瀏覽

這篇文章帶給大家的內容是關於淺析Java8中Lambda表達式:為什麼要使用Lambda表達式,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

Lambda表達式是Java8最受歡迎的功能。人們將函數式程式設計的概念引入了 Java 這門完全物件導向的命令式程式語言。

關於函數式程式設計是如何運作的,這個主題超出了本文的範圍,不過我們會提煉出它一個明顯有別於我們所經常使用的OOP (物件導向程式設計)的功能來加以討論。

在本文中, 我們將了解到 lambda 表達式具體是什麼東西,還有就是它們是如何將自己融入整個 Java 生態系統的。我們也會對沒有使用 lambda 表達式的程式碼以及後面使用 lambda 進行重構的範例程式碼進行一下觀察和比較。

了解 Lambda 表達式

Lambda 表達式是一塊我們可以將其傳入並執行的程式碼。對於身為 Java 程式設計師的我們而言,並不會怎麼習慣將一塊程式碼傳入一個函數這樣的方式。我們的習慣是將定義的程式碼封裝到方法體裡面,然後透過物件參考來執行,如下所示:

public class LambdaDemo {
    public void printSomething(String something) {
        System.out.println(something);
    }
    public static void main(String[] args) {
        LambdaDemo demo = new LambdaDemo();
        String something = "I am learning Lambda";
        demo.printSomething(something);
    }
}

## 這是經典OOP 開發範式的風格,將方法實作對呼叫者隱藏。呼叫者只是簡單地向方法傳入一個變量,然後方法拿這個變量會執行一些操作,並返回另外一個變量值,或者如我們的示例所示,會產生一些副作用效果。

  現在我們要來看看一種使用了行為傳遞方式,而不是變數傳遞的等效實作。為此,我們要建立一個函數式的接口,裡面定義的是對行為,而不是方法的抽象化。一個函數式介面是一種只有一個方法的介面:

public class LambdaDemo {
    interface Printer {
        void print(String val);
    }
    public void printSomething(String something, Printer printer) {
        printer.print(something);
    }
}

#在上面的程式碼實作中, Printer 介面負責所有的列印作業。 printSomething 方法不再定義行為,而是執行由 Printer 定義的行為:

#

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something = "I am using a Functional interface";
    Printer printer = new Printer() {
        @Override
        public void print(String val) {
            System.out.println(val);
        }
    };
    demo.printSomething(something, printer);
}

##讀者中比較有觀察能力的可能已經注意到,我並沒有在這裡做什麼新的事情。的確是這樣的,因為我還沒有應用到 lambda 表達式。我們只是簡單地創建了一個 Printer 介面的特定實現,並將它傳入了 printSomething 方法。

上面的範例旨在為我們帶來一個將Lambda 表達式引入到Java 中的關鍵目標:

Lambda 表達式原被用於定義一個函數式介面的內聯實現

在我們使用lambda 表達式對上面的範例進行重構之前,先來學習一下必要的語法知識:

(param1,param2,param3...,paramN) - > {//代码块;}

一個lambda 表達式的組成,是一個我們通常會定義在方法聲明中的,以括號封閉起來並以逗號分隔的參數列表,後面跟上一個箭頭標記指向要執行的代碼。現在,讓我們來使用 lambda 對上面的程式碼進行重構:

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something = "I am learning Lambda";
    /**/
    Printer printer = (String toPrint)->{System.out.println(toPrint);};
    /**/
    demo.printSomething(something, printer);
}
}

看起來非常緊湊且美觀。因為函數式介面只宣告了一個方法,所以在 lambda 的第一部分中傳入的參數被自動地映射到了方法的參數列表上,而箭頭右邊的程式碼則被當做是方法的具體實作了。

為什麼要使用 Lambda 表達式

如同前面的範例, lambda 表達式能讓我們擁有更緊湊的程式碼,更容易閱讀和追蹤。這個在效能和多核心處理方法還有其它的一些好處,不過它們得在你了解了 Streams API 以後才有用,而這個超出了本文的範圍。

透過比較使用和沒使用lambda 的main 方式實現,當它一下子把程式碼變得簡短的時候,我們切實地看到了lambda 表達式的能力:

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something = "I am learning Lambda";
    /**/
    Printer printer = (String toPrint)->{System.out.println(toPrint);};
    /**/
    demo.printSomething(something, printer);
}

我們也可以讓程式碼比這裡所展示的更簡潔。這樣的事情發生時,你甚至無需指定箭頭左邊參數的類型,而其類型會由編譯器根據介面方法的形參推斷出來。

Printer printer = (toPrint)->{System.out.println(toPrint);};

我們還可以做得更好。 lambda 的另一個特性就是: 如果只有一個參數, 就可以將括弧完全消除掉。同樣的,如果在箭頭右邊只有一條語句,也可以將大括號去掉:

#
Printer printer = toPrint -> System.out.println(toPrint);

現在的程式碼看起來真正變得可愛起來,不過我們才剛開始而已。如果我們的介面方法並不要任何參數,那就可以將生命用一對空的括弧替換掉:

() -> System.out.println("anything");

如果我們只是內聯一個lambda進去,而不去先創建一個物件然後將其傳入到saySomething 方法,會如何呢:

public static void main(String[] args) {
    LambdaDemo demo = new LambdaDemo();
    String something="I am Lambda";    /**/
    demo.printSomething(something, toPrint -> System.out.println(toPrint));
}

現在我們才是真的在談論函數式程式了。我們的 main 函數體從一開始的 9 行程式碼減少到了 3 行。這樣緊湊的程式碼使得 lambda 表達式對於 Java 程式設計師非常有吸引力。

以上是淺析Java8中Lambda表達式:為什麼要使用Lambda表達式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn