JDK8的重要新特性之一——Lambda表達式:
Lambda 表達式也可稱爲閉包,是推進 Java 8 發佈的最重要新特性。Lambda表達式實質上是一個匿名方法,Lambda容許把函數做爲一個方法的參數(函數做爲參數傳遞進方法中)或者把代碼當作數據。使用 Lambda 表達式可使代碼變的更加簡潔緊湊。java
Lambda表達式的語法結構:
(參數列表) -> {代碼塊}編程
須要注意:數組
· 參數類型可省略,編譯器能夠本身推斷 · 若是隻有一個參數,圓括號能夠省略 · 代碼塊若是隻是一行代碼,大括號也能夠省略 · 若是代碼塊是一行,且是有結果的表達式, return 能夠省略閉包
(param1,param2)->{ } (type1 param1,type2 param2)->{ body } 箭頭左邊是抽象方法的參數 右邊是抽象方法實現體
1)一個Lambda表達式能夠有零個或多個參數。 2)全部參數須要包含在圓括號內,參數之間用逗號相隔。 3)圓括號表明參數集爲空。例如()->42. 4)參數的類型既能夠明確聲明,也能夠根據上下文來推斷。app
函數式接口:
只包含一個抽象方法的接口,稱爲函數式接口;函數式編程
Runnable 、Comparator 都是函數式接口的典型表明。在實踐中,函數接口是很是脆弱的,只要有人在接口裏添加多一個方法,那麼這個接口就不是函數接口了,就會致使編譯失敗。Java8提供了一個特殊的註解@FunctionalInterface 來克服上面提到的脆弱性而且顯示地代表函數接口。函數
1,Function類型接口:code
@FunctionalInterface public interface Function<T,R> { //接收一個參數T,返回一個結果R R apply(T t); }
【Function表明的是有參數,有返回值的函數。】對象
2,Consumer系列:接口
@FunctionalInterface public interface Consumer<T> { //接收T類型參數,不返回結果 void accept(T t); }
【Consumer系列與Function系列同樣,有各類衍生接口,但不返回任何結果。】
3, Predicate系列:
@FunctionalInterface public interface Predicate<T> { //接收T類型參數,返回boolean類型結果 boolean test(T t); }
Java 內置四大核心函數式接口:
- Consumer<T>: 消費型接口,表示一個接受單個輸入參數並返回沒有結果的操做。對類型爲T的對象應用操做。接口方法: void accept(T t)
- Supplier<T>: 供給型接口,相似一個供應商,返回一個類型爲T的對象。接口方法: T get()
- Function<T, R>: 函數型接口,表示一個接受一個參數併產生結果的函數。接口方法: R apply(T t)
- Predicate<T>: 斷言型接口,肯定類型爲T的對象是否知足某約束,並返回boolean 值。接口方法: boolean test(T t)
StreamAPI:
Java8中有兩大最爲重要的改變。第一個是 Lambda 表達式;另一個則是 Stream API。
新增的Stream API(java.util.stream)將生成環境的函數式編程引入了Java庫中。這是目前爲止最大的一次對Java庫的完善,以便開發者可以寫出更加有效、更加簡潔和緊湊的代碼。
流(Stream)究竟是什麼?
是數據渠道,用於操做數據源(集合、數組等)所生成的元素序列。
Stream 的操做三個步驟:
- 建立 Stream: 一個數據源(如:集合、數組),獲取一個流。
- 中間操做: 一箇中間操做鏈,對數據源的數據進行一系列處理。
- 終止操做(終端操做): 一個終止操做,執行中間操做鏈,併產生結果。
注意:
- Stream 本身不會存儲元素。
- Stream 不會改變源對象。相反,他們會返回一個持有結果的新 Stream。
- Stream 操做是延遲執行的。這也意味着他們會等到須要結果的時候才執行。