狠狠撸

狠狠撸Share a Scribd company logo
Java Functional API
認識Lambda 
在諸如Lisp、Python的語言中,Lambda是代表 
● 匿名函數(Anonymous) 
● 閉包(Closure) 
● 在許多程式語言之中早就有它的身影存在 
在實用上 
● is a way to refactor refactored codes
從JavaScript看起 
當函式是物件時,我們可以: 
● 根據需要將之傳遞給另一個變數參考 
● 可以傳遞給別的函式進行動作 
● 流桯中不同的演算需求,可以設計回呼函式 
來抽換
從JavaScript看起 
這樣做可以 
● 簡化語法 
● 開放了更多不同設計方式的可能性
看看闯补惫补
看看闯补惫补 
匿名類別 
● 程式碼太冗長,可讀性降低 
● sort在做什麼?
看看闯补惫补 
宣告實作介面變數 
● 原來是在做升冪排序 
● 但...
看看闯补惫补
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 
● Lazy 
o 處理檔案的IO,變得更有效率 
● 使用Optional來代替null 
● Supplier<T> 
o none → get() → T
Functional API 
平行處理 
JDK8引入Lambda目的之一,就是為了讓開 
發者在開發平行程式更為簡便
Functional Programming 
當你在 
● 重構現有的程式碼 
● 運用filter、map、reduce等 
● 回傳Optional而非null 
● 開始使用parallelism以及考慮相關議題 
就是在實作Functional Programming
2014 Java Developer Day會後分享 Java Functional API

More Related Content

2014 Java Developer Day會後分享 Java Functional API