JDK8新特徵:Lambda,函數式接口,StreamAPI

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 的操做三個步驟:

  1. 建立 Stream: 一個數據源(如:集合、數組),獲取一個流。
  2. 中間操做: 一箇中間操做鏈,對數據源的數據進行一系列處理。
  3. 終止操做(終端操做): 一個終止操做,執行中間操做鏈,併產生結果。

注意:

  1. Stream 本身不會存儲元素。
  2. Stream 不會改變源對象。相反,他們會返回一個持有結果的新 Stream。
  3. Stream 操做是延遲執行的。這也意味着他們會等到須要結果的時候才執行。
相關文章
相關標籤/搜索