SlideShare a Scribd company logo
Submit Search
Upload
Lambda
Report
Share
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
•
3 likes
•
622 views
1
of
117
Lambda
•
3 likes
•
622 views
Report
Share
Download Now
Download to read offline
Technology
認識Lambda語法 運用方法參考 瞭解介面預設方法 善用Functional與Stream API Lambda與平行化
Read more
Justin Lin
Technology / Community Evangelist at Free lancer
Follow
Recommended
CH12:Lambda by
CH12:Lambda
Justin Lin
379 views
•
110 slides
C#版本3~5的新特性 by
C#版本3~5的新特性
國昭 張
1.5K views
•
60 slides
Java SE 8 技術手冊第 15 章 - 通用API by
Java SE 8 技術手冊第 15 章 - 通用API
Justin Lin
2.2K views
•
82 slides
Java SE 8 技術手冊第 3 章 - 基礎語法 by
Java SE 8 技術手冊第 3 章 - 基礎語法
Justin Lin
5.3K views
•
52 slides
Java functional api by
Java functional api
javakidxxx
290 views
•
20 slides
Java SE 8 技術手冊第 12 章 - Lambda by
Java SE 8 技術手冊第 12 章 - Lambda
Justin Lin
4.4K views
•
100 slides
More Related Content
More from Justin Lin
Ch14 簡介 Spring Boot by
Ch14 簡介 Spring Boot
Justin Lin
872 views
•
22 slides
Ch13 整合 Spring MVC/Security by
Ch13 整合 Spring MVC/Security
Justin Lin
280 views
•
58 slides
Ch12 Spring 起步走 by
Ch12 Spring 起步走
Justin Lin
274 views
•
31 slides
Ch11 簡介 JavaMail by
Ch11 簡介 JavaMail
Justin Lin
157 views
•
8 slides
Ch10 Web 容器安全管理 by
Ch10 Web 容器安全管理
Justin Lin
153 views
•
30 slides
Ch09 整合資料庫 by
Ch09 整合資料庫
Justin Lin
233 views
•
92 slides
More from Justin Lin
(20)
Ch14 簡介 Spring Boot by Justin Lin
Ch14 簡介 Spring Boot
Justin Lin
•
872 views
Ch13 整合 Spring MVC/Security by Justin Lin
Ch13 整合 Spring MVC/Security
Justin Lin
•
280 views
Ch12 Spring 起步走 by Justin Lin
Ch12 Spring 起步走
Justin Lin
•
274 views
Ch11 簡介 JavaMail by Justin Lin
Ch11 簡介 JavaMail
Justin Lin
•
157 views
Ch10 Web 容器安全管理 by Justin Lin
Ch10 Web 容器安全管理
Justin Lin
•
153 views
Ch09 整合資料庫 by Justin Lin
Ch09 整合資料庫
Justin Lin
•
233 views
Ch08 自訂標籤 by Justin Lin
Ch08 自訂標籤
Justin Lin
•
133 views
Ch07 使用 JSTL by Justin Lin
Ch07 使用 JSTL
Justin Lin
•
161 views
Ch06 使用 JSP by Justin Lin
Ch06 使用 JSP
Justin Lin
•
250 views
Ch05 Servlet 進階 API、過濾器與傾聽器 by Justin Lin
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
•
204 views
Ch04 會話管理 by Justin Lin
Ch04 會話管理
Justin Lin
•
238 views
Ch03 請求與回應 by Justin Lin
Ch03 請求與回應
Justin Lin
•
236 views
Ch02 撰寫與設定 Servlet by Justin Lin
Ch02 撰寫與設定 Servlet
Justin Lin
•
352 views
CH1. 簡介 Web 應用程式 by Justin Lin
CH1. 簡介 Web 應用程式
Justin Lin
•
1.2K views
14. 進階主題 by Justin Lin
14. 進階主題
Justin Lin
•
406 views
13.並行、平行與非同步 by Justin Lin
13.並行、平行與非同步
Justin Lin
•
237 views
12. 除錯、測試與效能 by Justin Lin
12. 除錯、測試與效能
Justin Lin
•
153 views
11. 常用內建模組 by Justin Lin
11. 常用內建模組
Justin Lin
•
149 views
10. 資料永續與交換 by Justin Lin
10. 資料永續與交換
Justin Lin
•
156 views
9. 資料結構 by Justin Lin
9. 資料結構
Justin Lin
•
292 views
Recently uploaded
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
43 views
•
25 slides
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
40 views
•
37 slides
Hacking Facebook for fun and profit by Pranav Hivarekar by
Hacking Facebook for fun and profit by Pranav Hivarekar
Pranav Hivarekar
6 views
•
69 slides
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan
151 views
•
54 slides
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
43 views
•
32 slides
AI Technology & Development of Civilization by
AI Technology & Development of Civilization
unclebrown017
44 views
•
74 slides
Recently uploaded
(6)
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
AIoT 智能商店_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
•
43 views
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
商品辨識定位系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
•
40 views
Hacking Facebook for fun and profit by Pranav Hivarekar by Pranav Hivarekar
Hacking Facebook for fun and profit by Pranav Hivarekar
Pranav Hivarekar
•
6 views
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式 by Shengyou Fan
[GDG Kaohsiung DevFest 2023] 以 Compose 及 Kotlin Multiplatform 打造多平台應用程式
Shengyou Fan
•
151 views
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班 by IttrainingIttraining
居家雲端照護系統_艾鍗學院-AIoT智能行動服務物聯網班
IttrainingIttraining
•
43 views
AI Technology & Development of Civilization by unclebrown017
AI Technology & Development of Civilization
unclebrown017
•
44 views
Lambda
2.
Lambda 學習目標 • 認識Lambda語法 • 運用方法參考 •
瞭解介面預設方法 • 善用Functional與Stream API • Lambda與平行化
3.
Lambda語法概覽 • 匿名類別的應用場合
4.
Lambda語法概覽 • 稍微改變Arrays.sort()該行的可讀性
5.
Lambda語法概覽 • 使用JDK8的Lambda表示式 • 編譯器可以從byLength變數的宣告型態, name1與name2的型態
6.
Lambda語法概覽 • 直接放到Arrays的sort()方法中
7.
Lambda語法概覽 • 將一些字串排序時可能的方式都定義出來
8.
Lambda語法概覽 • 原本的依名稱長度排序就可以改寫為: • JDK8
提供了方法參考(Method reference)
9.
Lambda語法概覽 • 方法參考的特性,在重用現有API上扮演了重 要角色。重用現有方法實作,可避免到處寫 下Lambda運算式
10.
Lambda語法概覽 • byLexicography()方法實作中,只不過 是呼叫String的compareTo()方法 • 可直接參考String類別的compareTo方法
11.
Lambda語法概覽 • 想對名稱按照字典順序排序,但忽略大小寫 差異 • 方法參考不僅避免了重複撰寫Lambda運算式 ,也可以讓程式碼更為清楚
12.
Lambda表示式與函式介面 • 等號右邊是Lambda表示式(Expression), 等號左邊是作為Lambda表示式的目標型態( Target type)
13.
Lambda表示式與函式介面 • Lambda表示式:
14.
Lambda表示式與函式介面 • 如果有目標型態的話,在編譯器可推斷出類 型的情況下,就可以不寫出Lambda表示式的 參數型態 • Lambda表示式本身是中性的,不代表任何型 態的實例,同樣的Lambda表示式,可用來表 示不同目標型態的物件實作
15.
Lambda表示式與函式介面 • 函式介面就是介面,要求僅具單一抽象方法
16.
Lambda表示式與函式介面 • 匿名類別不是不好,只不過有其應用的場合 • 在許多時候,特別是介面只有一個方法要實 作時,你會只想關心參數及實作本體
17.
Lambda表示式與函式介面 • 如果函式介面上定義的方法只接受一個參數
18.
Lambda表示式與函式介面 • @FunctionalInterface在JDK8中被引入 • 並非函式介面的話會編譯錯誤,例如:
19.
Lambda遇上this與final • Lambda表示式並不是匿名類別的語法蜜糖
20.
Lambda遇上this與final
21.
Lambda遇上this與final
22.
Lambda遇上this與final • 以下在JDK8中不會有錯:
23.
Lambda遇上this與final • 如果Lambda表示式中捕獲的區域變數本身等 效於final區域變數,可以不用在區域變數 上加上final。 • 可以在Lambda表示式中改變被捕獲的區域變 數值嗎?答案是不行!
24.
方法與建構式參考 • 可以使用靜態方法來定義函式介面實作
25.
方法與建構式參考 • 方法參考(Method references)可以避免你到 處寫下Lambda表示式,儘量運用現有的API 實作,也可以改善可讀性
26.
方法與建構式參考 • 可以參考特定物件的實例方法
27.
方法與建構式參考 • 可以參考類別上定義的非靜態方法
28.
方法與建構式參考 • 建構式參考(Constructor references)用來重 用現有API的物件建構流程
29.
介面預設方法 • 在JDK8中,interface定義時可以加入預 設實作,或者稱為預設方法(Default methods)
30.
介面預設方法 • forEach()方法本身已有實作,所以不會破 壞Iterable現有的其他實作 • 預設方法中不能使用資料成員 •
預設方法中不能有直接變更狀態的流程
31.
介面預設方法 • JDK8新增了預設方法,這也給了共用相同實 作的方便性
32.
介面預設方法 • 如果有個Ball類別打算實作這個自定義的 Comparable介面的話
33.
介面預設方法 • 從JDK9開始,介面中也可以定義private 方法了
34.
介面預設方法 • 實作介面是廣義的多重繼承 • JDK8中允許有預設實作,引入了強大的威力 ,也引入了更多的複雜度 •
你得留意到底採用的是哪個方法版本
35.
介面預設方法 • 父介面中的抽象方法,可以在子介面中以預 設方法實作 • 父介面中的預設方法,可以在子介面中被新 的預設方法重新定義 •
重新定義父類別中預設方法實作為抽象方法
36.
介面預設方法 • 如果重新定義為預設方法時,想明確呼叫某 個父介面的draw()方法,必須使用介面名稱 與super明確指定
37.
介面預設方法 • 如果實作時有兩個介面都定義了相同方法簽 署的預設方法,那麼會引發衝突 • 解決的方式是明確重新定義,無論是重新定 義為抽象或預設方法 •
如果重新定義為具體方法時,想明呼叫某個 介面的方法,也是得使用介面名稱與super 明確指定
38.
介面預設方法 • 如果類別實作的兩個介面擁有相同的父介面 ,其中一個介面重新定義了父介面的預設方 法,而另一個介面沒有,那麼實作類別會採 用重新定義了的版本 • 如果子類別繼承了父類別同時實作某介面, 而父類別中的方法與介面中的預設方法具有 相同方法簽署,則採用父類別的方法定義
39.
介面預設方法 • 簡單來說,類別中的定義優先於介面中的定 義,如果有重新定義,就以重新定義的為主 ,必要時使用介面與super指定採用哪個預 設方法 • JDK8除了讓介面可以定義預設方法之外,也 開始允許在介面中定義靜態方法
40.
介面預設方法 • Iterable介面新增forEach()預設方法:
41.
介面預設方法 • Iterator也有個forEachRemaining() 的預設實作
42.
介面預設方法 • Comparator也定義了一些預設方法
43.
使用Optional取代null • 你經常會與NullPointerException奮戰 • null的最根本問題在於語意含糊不清
44.
使用Optional取代null • 呼叫方法時如果傳回型態是Optional,應 該立即想到它可能包裹也可能不包裹值
45.
使用Optional取代null • 在Optional沒有包含值的情況下,get會 拋出NoSuchElementException
46.
使用Optional取代null • Optional的ofNullable()來銜接程式庫 中會傳回null的方法
47.
標準API的函式介面 • JDK8已經定義了幾個通用的函式介面 • 基本上可以分為Consumer、Function、 Predicate與Supplier四個類型
48.
標準API的函式介面 • 如果需要的行為是接受一個引數,然後處理 後不傳回值,就可以使用Consumer介面
49.
標準API的函式介面 • 接受了引數但沒有傳回值,這行為就像純綷 消耗了引數,就是命名為Consumer的原因 • 真的有結果產生,就是以副作用(Side
effect )形式呈現
50.
標準API的函式介面 • 接受一個引數,然後以該引數進行計算後傳 回結果,就可以使用Function介面 • 行為就像是數學函數y=f(x),給予x值計算 出y值的概念,因此命名為Function
51.
標準API的函式介面 • 接受一個引數,然後只傳回boolean值,也 就是根據傳入的引數直接論斷真假的行為, 就可以使用Predicate函式介面
52.
標準API的函式介面 • 需要的行為是不接受任何引數,然後傳回值 ,那可以使用Supplier函式介面
53.
使用Stream進行管線操作 • 在正式瞭解Stream介面的作用之前
54.
使用Stream進行管線操作 • 在JDK8中,這類的需求,建議改用以下的程 式來完成:
55.
使用Stream進行管線操作 • 能夠達到這類惰性求值(Lazy evaluation)的 效果,功臣就是Stream實例 •
第一個程式片段搭配for迴圈進行外部迭代( External iteration)第二個程式片段內部迭代 (Internal iteration) • 因為內部迭代的行為是被隱藏的,因此多了 很多可以實現效率的可能性。
56.
使用Stream進行管線操作 • 絕大多數的Stream並不需要呼叫close() 方法 • JDK8中要close()的是Files.lines()、 Files.list()與Files.walk()方法
57.
使用Stream進行管線操作 • JDK8引入了Stream API,也引入了管線操 作風格 –
來源(Source) – 零或多個中介操作(Intermediate operation) – 一個最終操作(Terminal operation)
58.
使用Stream進行管線操作 • 原本有個程式片段:
59.
使用Stream進行管線操作 • 在JDK8中可以改為以下的風格:
60.
使用Stream進行管線操作 • 如果你的程式在for迴圈中使用了if:
61.
使用Stream進行管線操作 • 如果你的程式在for迴圈中從一個型態對應 至另一個型態:
62.
使用Stream進行管線操作 • 許多時候,for迴圈中就是滲雜了許多小任 務,從而使for迴圈中的程式碼艱澀難懂 • Stream只能迭代一次,重複對Stream進行迭 代,會引發IllegalStateException
63.
Stream的reduce與collect • 程式設計中不少地方存在類似需求
64.
Stream的reduce與collect • 程式中這類需求都存在著類似的流程結構, 而你也不斷重複撰寫著類似結構,而且從閱 讀程式碼角度來看,無法一眼察覺程式意圖
65.
Stream的reduce與collect • 在JDK8中,可以改寫為:
66.
Stream的reduce與collect • 先前的迴圈結構,實際上有個步驟都是將一 組數據逐步取出削減,然而透過指定運算以 取得結果的結構 • JDK8將這個流程結構通用化,定義了 reduce()方法來達到自訂運算需求
67.
Stream的reduce與collect
68.
Stream的reduce與collect • 如果你想將一組員工的男性收集至另一個 List<Employee>呢?
69.
Stream的reduce與collect • Collector主要的四個方法是: –suppiler()傳回Suppiler,定義收集結 果的新容器如何建立 –accumulator()傳回BiConsumer,定義 如何使用結果容器收集物件 –combiner()傳回BinaryOperator,定 義若有兩個結果容器,如何合併為一個結果容器 –finisher()傳回Function,選擇性地定 義如何將結果轉換為最後的結果容器。
70.
Stream的reduce與collect • 來看看Stream的collect()方法另一版本
71.
Stream的reduce與collect • 可以先看看Collectors上提供了哪些 Collector實作
72.
Stream的reduce與collect
73.
關於flatMap()方法 • 在程式設計中有時會出現巢狀或瀑布式的流 程,就結構來看每一層運算極為類似,只是 傳回的型態不同,很難抽取流程重用
74.
關於flatMap()方法 • 巢狀的層次可能還會更深,像是 ...
75.
關於flatMap()方法 • 如果能修改getCustomer()傳回 Optional<Customer>、也修改 getAddress()傳回Optional<String>
76.
關於flatMap()方法 • 每一層都是Optional型態了,而每一層都 是isPresent()的判斷,然後將 Optional<T>轉換為Optional<U>
77.
關於flatMap()方法 • 直接使用Optional的flatMap()方法: • 第二個程式片段,改寫為以下就清楚多了…
78.
關於flatMap()方法 • flatMap()就像是從盒子取出另一盒子( flat就是平坦化的意思) • Lambda表示式指定了前一個盒子中的值與下 一個盒子之間的轉換關係 •
運算情境被隱藏了,使用者可明確指定感興 趣的特定運算,從而使程式碼意圖顯露出來 • 可接暢地接續運算,以避免巢狀或瀑布式的 複雜檢查流程。
79.
關於flatMap()方法 • 如果你沒辦法修改傳回型態怎麼辦?
80.
關於flatMap()方法 • 連續取得List
81.
關於flatMap()方法 • 用List的stream()方法取得Stream之後 ,使用flatMap()方法
82.
關於flatMap()方法 • 從盒子中取出盒子的操作(一個Stream接著 一個Stream)可以接續下去
83.
關於flatMap()方法 • 如果能瞭解Optional、Stream(或其他型 態)的flatMap()方法,其實就是取得盒子 中的值,讓你指定這個值與下個盒子間的關 係,那在撰寫與閱讀程式碼時,忽略掉 flatMap這個名稱,就能比較清楚程式碼的主 要意圖
84.
關於flatMap()方法 • 在JDK9中,Collectors上新增了 flatMapping()方法,可指定flatMap操作 並傳回Collector實例 • 用來減少管線操作的層次,或者建立可重用 的Collector
85.
關於flatMap()方法
86.
Stream相關API • Stream、IntStream、DoubleStream等 都有of()靜態方法 • 各可傳回Stream、IntStream、 DoubleStream實例
87.
Stream相關API • Stream、IntStream、DoubleStream等 各有generate()與iterate()靜態方法 • 可以分別建立Stream、IntStream、 DoubleStream實例
88.
Stream相關API • IntStream上有range()與 rangeClosed()方法,它們傳回 IntStream實例
89.
Stream相關API • CharSequence上新增了chars()與 codePoints()兩個方法 • 前者代表一串字元的整數值,後者代表一串 字元的碼點(Code
point)
90.
Stream相關API • JDK8中新增了java.util.Random類別
91.
Optional的API增強
92.
Optional的API增強
93.
Optional的API增強
94.
Stream的API增強
95.
Stream的API增強 • JDK8中的Stream只有一個iterate()版本 • 在JDK9中新增了另一個iterate()版本:
96.
Stream的API增強 • JDK9還新增了takeWhile()與 dropWhile()方法
97.
Stream與平行化 • 要獲得平行處理能力在JDK8中可以說很簡單
98.
Stream與平行化 • JDK8希望你想要進行平行處理時,必須有明 確的語義 • 想要知道Stream是否為平行處理,可以呼叫 isParallel()來得知
99.
Stream與平行化 • 天下沒有白吃的午餐 – 留意平行處理時的順序需求 –
不要干擾Stream來源 – 一次做一件事
100.
Stream與平行化 • 使用了parallelStream(),不代表一定 會平行處理而使得執行必然變快 • 得思考處理過程是否能夠分而治之而後合併 結果,如果可能,方能從中獲益
101.
Stream與平行化 • Collectors有groupingBy()與 groupingByConcurrent()
102.
Stream與平行化 • Stream實例若具有平行處理能力,處理過程 會分而治之
103.
Stream與平行化 • 使用forEachOrdered()這類的有序處理 時,可能會(或完全失去)失去平行化的一 些優勢 • 實際上中介操作亦有可能如此,例如 sorted()方法 •
API文件上基本上會記載終結操作時是否依來 源順序
104.
Stream與平行化 • reduce()基本上是按照來源順序,而 collect()得視給予的Collector而定
105.
Stream與平行化 • 在collect()操作時若想要有平行效果 – Stream必須有平行處理能力。 –
Collector必須有 Collector.Characteristics.CONCURREN T特性。 – Stream是無序的(Unordered)或Collector具 Collector.Characteristics.UNORDERED 特性。
106.
Stream與平行化 • 當API在處理小任務時,你不應該進行干擾 • 這樣的程式會引發 ConcurrentModifiedException
107.
Stream與平行化 • 思考處理的過程中,實際上是由哪些小任務 組成
108.
Stream與平行化 • 記得一次只做一件事
109.
Stream與平行化 • 避免寫出以下的程式:
110.
Stream與平行化 • 如果你試圖進行平行化處理時,就會發現, alsoLt的順序並不照著numbers的順序 • 然而一次處理一個任務的版本,可以簡單地 改為平行化版本,而又沒有順序問題
111.
使用CompletableFuture • 非同步(Asynchronous)讀取文字檔案
112.
使用CompletableFuture • 回呼地獄(Callback hell)
113.
使用CompletableFuture • JDK8新增了CompletableFuture
114.
使用CompletableFuture • 繼續以非同步方式來處理結果
115.
CompletableFuture增強 • 若想要延遲執行的話,可以使用static的 delayedExecutor()方法:
116.
CompletableFuture增強 • CompletableFuture新增了 orTimeout()方法 • 當任務執行超過指定的時間,會拋出 java.util.concurrent.TimeoutExce ption
117.
CompletableFuture增強 • 使用completeOnTimeOut()指定超時發生 時的任務完成結果: