JAVA8的新特性詳解

簡介
Oracle在2014年3月份發佈了java8正式版,該版本增加了很多新特性,比如:函數式接口、lambda表達式、集合的流式操作、註解的更新、安全性增強、IO\NIO的改進
函數式接口
什麼是函數式接口
這是java8的一個核心概念,(Functional Interfaces).通過在接口中添加一個抽象方法,這些方法可以直接從接口中運行。我們有兩種方法去實現一個函數式接口 

  1. 在一個接口中定義唯一一個抽象方法,那麼這個接口就成爲函數式接口 
  2. 通過註解@functionalInterface,用來標註這個接口是一個函數式接口。推薦這種寫法,好處是如果接口不符合函數式接口的定義時,編譯器會報錯 
    Java.lang.Runnable就是一個典型的函數式接口;
    函數式接口的用途
    主要用在Lambda表達式和方法引用上
    代碼演示
    JAVA8的新特性詳解

函數式接口的特性
JAVA8的新特性詳解

1.函數式接口允許定義靜態方法
2.函數式接口允許定義default方法
3.函數式接口裏允許定義java.lang.Object裏的public方法 

泛型及繼承關係
接口可以繼承接口,如果一個父接口是一個函數接口,那麼子接口也有可能是一個函數式接口,那麼它的判斷依據是什麼呢? 
對於接口I, 假定M是接口成員裏的所有抽象方法的繼承(包括繼承於父接口的方法), 除去具有和Object的public的實例方法簽名的方法, 那麼我們可以依據下面的條件判斷一個接口是否是函數式接口, 這樣可以更精確的定義函數式接口。 
如果存在一個一個方法m, 滿足: 
• m的簽名(subsignature)是M中每一個方法簽名的子簽名(signature) 
• m的返回值類型是M中的每一個方法的返回值類型的替代類型(return-type-substitutable) 
那麼I就是一個函數式接口。
情況一
 JAVA8的新特性詳解

接口Z繼承了X,Y接口的m方法,由於這兩個方法的簽名相同,返回值也一樣,所以Z有唯一的一個抽象方法int m(List arg);,可以作爲函數式接口。
情況二
 JAVA8的新特性詳解

方法簽名Y.m既滿足簽名是X.m,並且返回值也滿足,所以Z仍然是函數式接口
情況三
 JAVA8的新特性詳解
編譯出錯,因爲沒有一個方法的簽名是所有方法的子簽名
Java.util.function
Lambda表達式在運行期間表示爲一個接口函數,而接口函數只是一種只定義了一個抽象方法的接口。儘管java8裏面已經有一些接口符合函數式接口的定義,比如Runnable , Comparator。但是對於我們來說顯然是不夠的。而如果我們需要在程序裏使用非函數數接口來實現lambda表達式的操作,那麼怎麼去做? Java8引入了一個新增的包java.util.function, 專門用來解決這個問題。這個包裏提供了很多接口 

JAVA8的新特性詳解
Lambda表達式
函數式接口的重要屬性是:我們能夠使用Lambda來實例化他們,Lambda表達式讓你能夠將函數作廢方法參數,或者將代碼作爲數據對待。
優點
在java8出現之前,匿名內部類,監聽器和事件處理的使用都顯得很冗長,代碼可讀性差,而Lambda表達式的應用能夠是代碼變得更加緊湊,可讀性增強
語法
Lambda表達式由三個部分組成: 
第一部分:一個括號內用逗號分割形式參數,參數是函數式接口裏面方法的參數 
第二部分:一個箭頭號 -> 
第三部分:方法體,可以是表達式和代碼塊
情況一
方法體爲表達式,則該表達式的值作爲返回值返回: 
JAVA8的新特性詳解
情況二
方法體爲代碼塊,必須要用{}包裹起來,如果該接口有返回值,則需要return返回值,反之則不需要 
JAVA8的新特性詳解
代碼演示
情況1, 對內部類進行簡化 
JAVA8的新特性詳解

情況2,我們用list排序來演示效果 

JAVA8的新特性詳解
簡化處理後
JAVA8的新特性詳解

方法引用
有時候Lambda表達式的代碼只是一個簡單的方法調用而已,而遇到另外一種情況我們可以更進一步去簡化,我們稱之爲方法引用;
引用靜態方法
引用對象的實例方法
引用某個類型的任意對象的實例方法
引用類構造函數
代碼演示 
我們同樣針對一個數組進行排序,綜合以上所有提到的方法引用類型 
第一步 
 JAVA8的新特性詳解

第二步 
JAVA8的新特性詳解
 
第三步 
 JAVA8的新特性詳解
集合流式操作
Java8引入了流式操作(Stream),通過該操作可以實現對集合的並行處理和函數式操作。 

  1. 根據操作返回的結果不同,流式操作又分爲中間操作和最終操作。最終操作返回的是一個特定類型的結果;而中間操作返回的是流本身,因此就可以將多個操作一次串聯起來; 
  2. 根據流的併發性、又可以分爲串行和並行兩種,流式操作實現了對集合的過濾、排序、映射等功能
    串行流和並行流
    通過串行流操作是在一個線程中依次完成,而並行流則是在多個線程上同時執行。並行和串行的流操作可以相互切換:通過 
    Stream.sequential()返回串行流 
    Stream.parallel() 返回並行流 
    相比於串行流,並行流可以很大程度上提高程序的執行效率 
    串行/並行排序演示 
    JAVA8的新特性詳解
    JAVA8的新特性詳解

中間操作
該操作會保持 stream 處於中間狀態,允許做進一步的操作。它返回的還是的 Stream,允許更多的鏈式操作。常見的中間操作有: 
filter():對元素進行過濾; 
sorted():對元素排序; 
map():元素的映射; 
distinct():去除重複元素; 
subStream():獲取子 Stream 等。
終止操作
該操作必須是流的最後一個操作,一旦被調用,Stream 就到了一個終止狀態,該操作之後不能再鏈式的添加其他操作。常見的終止操作有: 
forEach():對每個元素做處理; 
toArray():把元素導出到數組; 
findFirst():返回第一個匹配的元素; 
anyMatch():是否有匹配的元素等。
788692365阿里P8在此羣,可以在這裏和他進行java高級、架構方面的經驗學習交流。
JAVA8的新特性詳解
另有咕泡Java架構VIP七夕520告白金抽取機會

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章