SlideShare a Scribd company logo
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
Ad

Recommended

Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Java SE 8 的 Lambda 連鎖效應 - 語法、風格與程式庫
Justin Lin
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Java 開發者的函數式程式設計
Java 開發者的函數式程式設計
Justin Lin
 
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
lambda/closure – JavaScript、Python、Scala 到 Java SE 7
Justin Lin
 
Java SE 8 技術手冊第 12 章 - Lambda
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
 
Scala function-and-closures
Scala function-and-closures
wang hongjiang
 
functional-scala
functional-scala
wang hongjiang
 
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
 
Execution
Execution
Angel Boy
 
給初學者的Spark教學
給初學者的Spark教學
Chen-en Lu
 
Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
Ecmascript
Ecmascript
jay li
 
Javascript share
Javascript share
Xu Mac
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
Kris Mok
 
From Java Stream to Java DataFrame
From Java Stream to Java DataFrame
Chen-en Lu
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
 
Java SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
 
資料永續與交換
資料永續與交換
Justin Lin
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
 
Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
 
Java8 lambda
Java8 lambda
koji lin
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
jay li
 
5, initialization & cleanup
5, initialization & cleanup
ted-xu
 
Reactive X 响应式编程
Reactive X 响应式编程
Jun Liu
 
ES5 introduction
ES5 introduction
otakustay
 
Ch14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
 

More Related Content

What's hot (20)

Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
 
Execution
Execution
Angel Boy
 
給初學者的Spark教學
給初學者的Spark教學
Chen-en Lu
 
Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
Ecmascript
Ecmascript
jay li
 
Javascript share
Javascript share
Xu Mac
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
Kris Mok
 
From Java Stream to Java DataFrame
From Java Stream to Java DataFrame
Chen-en Lu
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
 
Java SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
 
資料永續與交換
資料永續與交換
Justin Lin
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
 
Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
 
Java8 lambda
Java8 lambda
koji lin
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
jay li
 
5, initialization & cleanup
5, initialization & cleanup
ted-xu
 
Reactive X 响应式编程
Reactive X 响应式编程
Jun Liu
 
ES5 introduction
ES5 introduction
otakustay
 
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Java SE 8 技術手冊第 14 章 - NIO 與 NIO2
Justin Lin
 
給初學者的Spark教學
給初學者的Spark教學
Chen-en Lu
 
Java SE 8 技術手冊第 10 章 - 輸入輸出
Java SE 8 技術手冊第 10 章 - 輸入輸出
Justin Lin
 
Java SE 8 技術手冊第 16 章 - 整合資料庫
Java SE 8 技術手冊第 16 章 - 整合資料庫
Justin Lin
 
Ecmascript
Ecmascript
jay li
 
Javascript share
Javascript share
Xu Mac
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
Kris Mok
 
From Java Stream to Java DataFrame
From Java Stream to Java DataFrame
Chen-en Lu
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
Justin Lin
 
Java SE 8 技術手冊第 15 章 - 通用API
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
 
資料永續與交換
資料永續與交換
Justin Lin
 
Introduction to Basic Haskell Components (In Chinese)
Introduction to Basic Haskell Components (In Chinese)
ChengHui Weng
 
Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
 
Java8 lambda
Java8 lambda
koji lin
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
jay li
 
5, initialization & cleanup
5, initialization & cleanup
ted-xu
 
Reactive X 响应式编程
Reactive X 响应式编程
Jun Liu
 
ES5 introduction
ES5 introduction
otakustay
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
 
Ch06 使用 JSP
Ch06 使用 JSP
Justin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Ch04 會話管理
Ch04 會話管理
Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應
Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
 
14. 進階主題
14. 進階主題
Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
 
11. 常用內建模組
11. 常用內建模組
Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
 
9. 資料結構
9. 資料結構
Justin Lin
 
Ch14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
 
Ch06 使用 JSP
Ch06 使用 JSP
Justin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Ch04 會話管理
Ch04 會話管理
Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應
Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
 
14. 進階主題
14. 進階主題
Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
 
11. 常用內建模組
11. 常用內建模組
Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換
Justin Lin
 
9. 資料結構
9. 資料結構
Justin Lin
 
Ad

Java 8 與 retrolambda