2014 java developer day會後分享 java functional api

24
Java Functional API

Upload: bio-yang

Post on 19-Jun-2015

206 views

Category:

Software


3 download

DESCRIPTION

2014 Java Developer Day會後分享 Java Functional API

TRANSCRIPT

Page 1: 2014 Java Developer Day會後分享 Java Functional API

Java Functional API

Page 2: 2014 Java Developer Day會後分享 Java Functional API

認識 Lambda

在諸如 Lisp、 Python的語言中, Lambda是代表● 匿名函數 (Anonymous)● 閉包 (Closure)● 在許多程式語言之中早就有它的身影存在在實用上● is a way to refactor refactored codes

Page 3: 2014 Java Developer Day會後分享 Java Functional API

從 JavaScript看起

當函式是物件時,我們可以:● 根據需要將之傳遞給另一個變數參考● 可以傳遞給別的函式進行動作● 流桯中不同的演算需求,可以設計回呼函式來抽換

Page 4: 2014 Java Developer Day會後分享 Java Functional API

從 JavaScript看起

這樣做可以● 簡化語法● 開放了更多不同設計方式的可能性

Page 5: 2014 Java Developer Day會後分享 Java Functional API

看看 Java

Page 6: 2014 Java Developer Day會後分享 Java Functional API

看看 Java

匿名類別● 程式碼太冗長,可讀性降低● sort在做什麼?

Page 7: 2014 Java Developer Day會後分享 Java Functional API

看看 Java

宣告實作介面變數● 原來是在做升冪排序● 但 ...

Page 8: 2014 Java Developer Day會後分享 Java Functional API

看看 Java

Page 9: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

等號左邊在宣告變數時已指定型別,所以

Page 10: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

Interface Comparator<T>→int compare(T o1, T o2)

編譯器可以從 Comparator<Integer>中推斷出 n1與 n2的型態,所以

Page 11: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

Page 12: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

Lambda表式示● 等號右邊是 Lambda表示式

o 本身是中性的,不代表任何型態的實例o 只關心方法簽署上的參數與回傳值,忽略方法名稱

● 等號左邊為 Lambda表示式的目標型態● 目標型態存在時,編譯器就可以據此推斷出型態

Page 13: 2014 Java Developer Day會後分享 Java Functional API

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

Java Lambda

最後我們可寫成

更簡潔明白了

Page 15: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

Page 16: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

方法參照● 重用現有方法實作,可以避免到處寫下

Lambda運算式● 程式碼更加清楚● 靜態方法 (static method)與物件的實例方法

(instance method)皆可參考

Page 17: 2014 Java Developer Day會後分享 Java Functional API

Java Lambda

JDK8的 Lambda● 語法上的新增● 與既有的 API相容,並增加其功能● 全新且更有威力的 API

從現在的程式進行重構開始著手

Page 18: 2014 Java Developer Day會後分享 Java Functional API

Functional API

Page 19: 2014 Java Developer Day會後分享 Java 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

Page 20: 2014 Java Developer Day會後分享 Java Functional API

Functional API

Page 21: 2014 Java Developer Day會後分享 Java Functional API

Functional API

● Lazyo 處理檔案的 IO,變得更有效率

● 使用 Optional來代替 null● Supplier<T>

o none → get() → T

Page 22: 2014 Java Developer Day會後分享 Java Functional API

Functional API

平行處理JDK8引入 Lambda目的之一,就是為了讓開發者在開發平行程式更為簡便

Page 23: 2014 Java Developer Day會後分享 Java Functional API

Functional Programming

當你在● 重構現有的程式碼● 運用 filter、 map、 reduce等● 回傳 Optional而非 null● 開始使用 parallelism以及考慮相關議題就是在實作 Functional Programming

Page 24: 2014 Java Developer Day會後分享 Java Functional API