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