1. 程式人生 > >Java8函數語言程式設計的巨集觀總結

Java8函數語言程式設計的巨集觀總結

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個限制
        • 初值必須為組合函式的恆等值
        • 組合操作必須符合結合律
  • 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函數語言程式設計》