(轉載: https://mp.weixin.qq.com/s/-PHOc6p-qKJBktle28AUgA)
一: 直接把代碼塊賦值給變量
我們知道,對於一個Java變量,我們可以賦給其一個“值”。
如果你想把“一塊代碼”賦給一個Java變量,應該怎么做呢? 比如,如下
在Java 8之前,這個是做不到的。但是Java 8問世之后,利用Lambda特性,就可以做到了。
Lambda表達式本身就是一個接口的實現
這種只有一個接口函數需要被實現的接口類型,我們叫它”函數式接口“。
為了避免后來的人在這個接口中增加接口函數導致其有多個接口函數需要被實現,變成"非函數接口”,我們可以在這個上面加上一個聲明@FunctionalInterface, 這樣別人就無法在里面添加新的接口函數了:
這樣,我們就得到了一個完整的Lambda表達式聲明:
二: 可以把代碼塊作為函數參數
Lambda表達式最直觀的作用就是使得代碼變得異常簡潔。
下圖是java 7 和 java 8的對比:顯示java 8 要簡潔的多。
我們就可以直接把Lambda作為參數傳給函數, 而傳統的Java必須有明確的接口實現的定義,初始化才行:
有些情況下,這個接口實現只需要用到一次。傳統的Java 7必須要求你定義一個“污染環境”的接口實現MyInterfaceImpl,而相較之下Java 8的Lambda, 就顯得干凈很多。
三: Lambda結合FunctionalInterface Lib, forEach, stream(),method reference等新特性可以使代碼變的更加簡潔!
使用stream, filter, forEach等使代碼非常簡潔:
persons.stream().filter( ( p) -> p.getFirstName().startsWith("Z")).forEach((p)-> System.out.println(p.getFirstName()));
四:Lambda配合Optional<T>可以使Java對於null的處理變的異常優雅
參考:http://www.cnblogs.com/liufei1983/p/8124551.html