1. 程式人生 > >java8新特性之lambda

java8新特性之lambda

函數式 var ride urn fun 模擬實現 face 清晰 例如

一、什麽是lambda

在函數編程中,我們經常將方法作為參數來傳遞,這樣不僅結構清晰而且更容易去組織一個良好的代碼結構。例如Javascript寫法:

<script type="text/javascript">    
    var test = function(callback) {
        // 通過函數引用調用傳入函數
        callback("callback")
    }
    // 調用test()並傳入函數實現
    test(function(message) {
        console.log(message)
    })
</script>

我們看到,在調用test(callback)方法的時候傳入了一個functioncallback則是該function的函數引用,那麽在test(callback)方法內部就可以通過callback這個函數引用來調用傳入的function實現

上面示例,通過JavaScript的寫法簡單演示了一個函數引用傳遞的寫法。那麽Java能夠實現這樣的寫法呢?

在JDK1.8之前,我們只能夠通過如匿名內部類的方式去實現,示例如下:

public class OldWay {

    public static void main(String[] args) {
        doSth(
new Callback() { @Override public void call() { System.out.println("匿名內部類的方式"); } }); } static void doSth(Callback callback) { callback.call(); } interface Callback { void call(); } }

匿名內部類可以模擬實現如JavaScript類似的函數引用傳遞,不過在JDK1.8以後我們可以不用這麽麻煩,因為1.8開始直接提供實現函數引用地寫法,也就是說你也可以在Java中通過一個函數引用來傳遞和調用函數,即是Java的lambda。

二、lambda的示例

我們知道了lambda其實就是支持將函數通過引用來傳遞和控制的寫法實現,那麽具體該如何去使用呢,直接來看一個示例:

public class LambdaTest {

    public static void main(String[] args) {
        Callback callback = (message) -> {
            System.out.println("the message is: " + message);
        };
        callback.call("hello lambda");
    }

    interface Callback {
        void call(String message);
    }
}

首先我們定義了一個接口Callback,其中包含一個方法call(String message)。

在main函數中 “ = ”號左邊即是引用,右邊的 “(message)” 表示方法對應的參數 “-> {} ” 中包著一塊輸出文本信息的代碼,也就是Callback接口聲明的call(String message)對應的具體實現。

接下來我們通過引用callback,調用其具體的函數call(String message)

下面我們簡單改寫一下,將函數作為參數進行傳遞

public class LambdaTest {

    public static void main(String[] args) {
        Callback callback = (message) -> {
            System.out.println("the message is: " + message);
        };
//        callback.call("hello lambda");
        test(callback);
    }

    static void test(Callback callback) {
        callback.call("hello lambda");
    }

    interface Callback {
        void call(String message);
    }
}

可以看到,在test方法中函數的具體實現可以被作為參數傳遞。lambda讓Java支持將函數作為參數傳遞進其它方法當中使用。

三、lambda的寫法

我們可以將lambda的寫法固定理解為如下寫法:

(參數) -> {具體代碼實現};

1、如果是一個參數的話可以不用加 "()"

參數 -> {具體代碼實現}

2、如果具體代碼實現只有一行語句,也可以不用加 "{}"

參數 -> 具體代碼實現

3、如果具體代碼中只有一個函數返回值的表達式,如:

參數 -> return 返回值

可以不用顯示聲明return,也會自動返回

參數 -> 返回值

但是如果具體代碼被 “{}”包裹,那麽必須加上 “return”。

四、總結

lambda是Java8的新特性之一,它將函數式編程的寫法引入的Java這樣面向對象的語言當中。而lambda的主要作用就是實現函數引用的傳遞,以獲取更加靈活的實現。當然,Java8很多特性將會和lambda組合使用。

java8新特性之lambda