java8新特性之lambda
一、什麽是lambda
在函數編程中,我們經常將方法作為參數來傳遞,這樣不僅結構清晰而且更容易去組織一個良好的代碼結構。例如Javascript寫法:
<script type="text/javascript"> var test = function(callback) { // 通過函數引用調用傳入函數 callback("callback") } // 調用test()並傳入函數實現 test(function(message) { console.log(message) }) </script>
我們看到,在調用test(callback)方法的時候傳入了一個function,callback則是該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