Java8函數語言程式設計的巨集觀總結
阿新 • • 發佈:2019-02-08
1.java8優勢
通過將行為進行抽象,java8提供了批量處理資料的並行類庫,使得程式碼可以在多核CPU上高效執行。
2.函數語言程式設計的核心
使用不可變值和函式,函式對一個值進行處理,對映成另一個值。
3.Lambda表示式
一種緊湊的、傳遞行為的方式。
4. 靜態型別語言
java8依舊是靜態型別語言,javac依舊會在編譯時,對引數型別進行檢查。
5.函式介面
只有一個抽象方法的介面,用作lamdba表示式的型別。
6.對核心類庫的改進-Stream
- 實現機制
整個過程:一系列惰性求值方法+最後一個及早求值方法 常用流操作
- collect
- 及早求值的方法,用於生成list,set,map。
- map
- 將一個流中的值轉化為一個新的流,對應的業務邏輯是:有一個函式需要將一種型別的值轉為另一種型別。
- filter
- 遍歷資料並檢查其中的元素,過濾掉不符合條件的元素。接受一個Predicate介面
- flatmap
- 可用Stream替換值,然後將多個Stream連線成一個Stream
- 例如:List together=Stream.of(list1,list2,…,listn).flatMap(num->num.stream()).collect(Collectors.toList());
- max和min
- 引數:引數為排序指標
- 格式:xx.stream().max(Comparator.comparing(…)).get();
- reduce
- 從一組值生成一個值
- 例如count(),sum()等
- 使用方法有兩種形式
- 有初始值
- 無初始值
返回物件:Optional物件
- 如果code想要並行化,則reduce操作有2個限制
- 初值必須為組合函式的恆等值
- 組合操作必須符合結合律
- collect
Stream迭代的優勢
- 利用Stream進行迭代,使得迭代過程從外部迭代 轉為 內部迭代。
- 外部迭代缺點:
本質上,屬於序列化操作
7. 對核心類庫的改進-集合類API
- 形式上:引入default方法和介面的static方法
- 基本型別的改變:
- 只包括:Integer,Long,Double共計3種,因為這3種在數值計算中使用的最多。
- Stream類的某些方法對基本型別和裝箱型別進行了區分,目的是減少裝箱拆箱的效能開銷。
- default方法出現的意義
實現了庫介面的自定義類,在庫介面新增新方法時,可以在不改變客戶端自定義類的情況下,使得自定義類正常執行。因為新新增的方法型別為default,這樣自定義的類雖然沒有實現這個介面方法,但是自動擁有了這個方法,因為庫介面提供了這個方法的預設實現。 - Optional新增資料型別
- 功能:
用於替換null - 使用Optional的目的
- Optional物件鼓勵程式設計師適時檢查變數是否為空。
- 它將一個類的API中可能為空的值文件化,更適合閱讀。
- 功能:
8.資料並行化
- 資料並行化的必要性
多核CPU的出現,需要通過並行化的code來提升現有程式碼的計算能力,而不再依賴提升CPU的時鐘頻率。 - 阿姆達爾定律
預測了搭載多核CPU的機器提升速度的理論最大值。例如,如果將一段完全序列化的code,一半改為並行化處理,則CPU>=2的所有情況中,理論上最大速度都是原來的2倍。因此,可以得出結論,問題的求解時間,完全取決於:問題可以被分解為幾個部分 - 影響並行流效能的5個因素
- 資料大小。因為涉及到資料分解、合併的開銷。
- 源資料結構。因為這涉及資料分割的開銷。
- 裝箱。
- 核的數量。這裡核的數量是指:執行時,機器能使用的核的數量,而不是機器上有多少核。
- 單元處理開銷。單元處理開銷時間越長,並行操作帶來的效能提升越明顯。
- 核心類庫的通用資料結構分類
- 分類標準
長度是否確定,結構是否複雜兩方面考慮。 - 效能好(長度確定,線性結構)
如ArrayList,陣列,Intstream.range等。支援隨機讀取,易分解。 - 效能一般(結構複雜,tree/hash型別)
如HashSet,TreeSet等,不易公平分解。 - 效能差(長度不定)
如LinkedList,分解時間複雜度為:O(N)。
- 分類標準
- java8對陣列新增的並行化操作方法
- Arrays.parallelPrefix,計算陣列的和
- Arrays.parallelSetAll,更新陣列元素
- Arrays.parallelSort,對陣列元素排序
參考書籍:《Java8函數語言程式設計》