Java 8 與 retrolambda Justin Lin caterpillar@openhome.cc http://openhome.cc
議程 • 從《重構》開始 • 使用 Java 8 Lambda • Retrolambda • 繼續重構 2 @ L -> :: 8765
從《重構》開始 3
4
5 租金計算
6 點數計算 租金計算
7 幾件事? 點數計算
8 點數加總 租借描述 租金加總
9 點數加總 租金加總
使用 Java 8 Lambda 10
11 迭代 Rental 加總租金 取得租金 三件事?
三件事? 12 迭代 Rental 加總點數 取得點數
13 Lambda expressionStream API
Lambda expression? 14 ->
Functional interface 15 Code as data
• Method reference 16 ::
17
Stream API? 18
• Stream 從來源取出資料,來源可以是 … – Collection, 例如 collection.stream() – 陣列, 例如 Arrays.stream(…) – 產生器, 例如 IntStream.generate(…) – I/O, 例如 Files.lines(…) – … • Stream 上有 intermediate operation 與 terminal operation。 19
20 intermediate operation terminal operation
21 迭代 Rental 串接各筆描述 該筆租借描述 Reduce?
Reduce • sum 就是一種 reduce 操作 22
Reduce • 遞迴 23
Reduce 24 串接各筆描述 各筆租借描述
25
26
27 好 Lambda … 不用嗎? ′o‵ 可是良葛 … ′ _` 我們上不去了 … ~~′ _`~~
Retrolambda 28 https://github.com/orfjackal/retrolambda
• 改寫 bytecode 為可運行於 Java 7, 6, 5 • 目前支援 … – Lambda expressions – Method references – Try-with-resources statements • 部份支援 … – Default methods – Static methods on interfaces • 採用方式 … – Command Line Application(結合 Ant) – Maven Plugin – Gradle Plugin 29
Command Line Application • 從 Maven Centrol 下載 retrolambda.jar 30
31 Java 8 編譯 Retrolambda Java 7 執行
Ant 32 ……
Gradle • Gradle Retrolambda Plugin – JDK8 – Gradle 2.x 33
34 Optional
35
36 繼續重構
Java 8 API? • LambdaJ • Linq4j • guava-libraries • Joda-Time • ThreeTen • streamsupport 37 r Functional API Stream API New Date & Time API
Java 8 API? • streamsupport 替代 java.util.stream 38 r
39
40
41
• Commit History 42
想瞭解更多? • Java Lambda Tutorial • 解析 JDK8 Functional API • Java 8 Patterns • 認識 Gradle • Retrolambda in Android • Java 8 Friday: Let’s Deprecate Those Legacy Libs 43
44 Justin Lin caterpillar@openhome.cc http://openhome.cc
The others? 45

Java 8 與 retrolambda