2014 Java Developer Day會後分享 Java Functional API
description
Transcript of 2014 Java Developer Day會後分享 Java Functional API
Java Functional API
認識 Lambda
在諸如 Lisp、 Python的語言中, Lambda是代表● 匿名函數 (Anonymous)● 閉包 (Closure)● 在許多程式語言之中早就有它的身影存在在實用上● is a way to refactor refactored codes
從 JavaScript看起
當函式是物件時,我們可以:● 根據需要將之傳遞給另一個變數參考● 可以傳遞給別的函式進行動作● 流桯中不同的演算需求,可以設計回呼函式來抽換
從 JavaScript看起
這樣做可以● 簡化語法● 開放了更多不同設計方式的可能性
看看 Java
看看 Java
匿名類別● 程式碼太冗長,可讀性降低● sort在做什麼?
看看 Java
宣告實作介面變數● 原來是在做升冪排序● 但 ...
看看 Java
Java Lambda
等號左邊在宣告變數時已指定型別,所以
Java Lambda
Interface Comparator<T>→int compare(T o1, T o2)
編譯器可以從 Comparator<Integer>中推斷出 n1與 n2的型態,所以
Java Lambda
Java Lambda
Lambda表式示● 等號右邊是 Lambda表示式
o 本身是中性的,不代表任何型態的實例o 只關心方法簽署上的參數與回傳值,忽略方法名稱
● 等號左邊為 Lambda表示式的目標型態● 目標型態存在時,編譯器就可以據此推斷出型態
Java Lambda
函式介面 (Functional Interface)● Comparator是一個函式介面● JDK8的 Lambda並未導入新型態,而是就現有
interface語法來定義,作為目標型態● 要求僅具單一抽象方法● 其他如 Runnable(void run())、 Callable(V call() throw Exception)等
Java Lambda
最後我們可寫成
更簡潔明白了
Java Lambda
Java Lambda
方法參照● 重用現有方法實作,可以避免到處寫下
Lambda運算式● 程式碼更加清楚● 靜態方法 (static method)與物件的實例方法
(instance method)皆可參考
Java Lambda
JDK8的 Lambda● 語法上的新增● 與既有的 API相容,並增加其功能● 全新且更有威力的 API
從現在的程式進行重構開始著手
Functional API
Functional API
● Predicate<T>o T → test(T t) → boolean
● Function<T,R>o T → apply(T t) → R
● Consumer<T>o T → accept(T t) → void
Functional API
Functional API
● Lazyo 處理檔案的 IO,變得更有效率
● 使用 Optional來代替 null● Supplier<T>
o none → get() → T
Functional API
平行處理JDK8引入 Lambda目的之一,就是為了讓開發者在開發平行程式更為簡便
Functional Programming
當你在● 重構現有的程式碼● 運用 filter、 map、 reduce等● 回傳 Optional而非 null● 開始使用 parallelism以及考慮相關議題就是在實作 Functional Programming