Effective Java Item 48:使用 parallel streams 要非常小心

整理 Effective Java 書中 Item 48: Use streams judiciously 心得筆記

主旨:parallel stream 用錯,效能與正確性可能雙雙出問題

Java 8 的 stream API 帶來了非常方便的資料處理方式,加上 .parallel() 方法,更是讓你只用一行就能平行運算聽起來很香。

但實際上呢?用錯地方,不僅效能沒提升,甚至會程式掛掉。平行化是進階優化技巧,不是萬靈丹。

Read more

Effective Java Item 47:回傳元素序列時優先使用 Collection 而非 Stream

整理 Effective Java 書中 Item 47: Prefer Collection to Stream 心得筆記

主旨:回傳元素序列時,應優先使用 Collection

Java 8 推出 streams 之後,我們在設計方法時有了新的回傳型別選擇。不過,若你要回傳一串元素,Collection 或其子型別通常仍是最合適的選擇,因為這樣使用者不論是想用 for-each 迴圈還是用 stream pipeline,都能方便操作。除非真的有特殊理由,否則不要只回傳 Stream。

Read more

Effective Java Item 46:偏好無副作用的函式

整理 Effective Java 書中 Item 46: Prefer side-effect-free functions in streams 心得筆記

主旨:Streams 核心原則就是「無副作用」

Java 的 streams API 雖然語法簡潔、功能強大,但若沒有掌握其「函數式編程」的核心精神,寫出來的程式碼可能又臭又長、難讀又難維護。本篇要講的,就是 streams 最重要的設計原則:偏好無副作用的函式(side-effect-free functions)

簡單來說,「副作用」是指函式除了回傳值之外,還會修改外部狀態。例如把某個值加進 map 或 list,就是副作用。真正的函數式風格應該避免這種做法,讓每個階段的處理都只是資料的轉換,不牽涉修改其他東西。

Read more

Effective Java Item 45:謹慎使用 streams

整理 Effective Java 書中 Item 45: Use streams judiciously 心得筆記

主旨

Java 8 推出的 streams API 是用來處理「大量資料的處理流程」的工具,它支援類似函式式的操作(例如 map、filter、collect 等),並能以流暢的語法串接多個處理階段。然而,streams 是一把雙面刃:用得好能讓程式簡潔清楚,用不好會讓人看不懂又難維護。

本篇要講的重點就是:該用的時候再用,避免過度使用。

點出問題

stream pipeline 可以寫得很精簡,例如:

Read more

Effective Java Item 44:用標準函式介面

整理 Effective Java 書中 Item 44: Use standard functional interfaces 心得筆記

主旨:學會選擇正確的標準函式介面

從 Java 8 開始,因為 lambda 的加入,我們寫 API 的思維也隨之改變。如果你需要傳入一段行為(function object),不再需要額外建立匿名類別,而是可以用 lambda 寫得更簡潔。但要寫出真正好用的 API,選對函式介面更是關鍵,盡可能用 Java 內建的標準函式介面,能讓程式碼更直觀、可讀性更高,也方便 IDE 自動補全與檢查。

點出問題:不該每次都自創介面

假設你想要建立一個可限制最大筆數的快取,會用 LinkedHashMap 來實作,並覆寫 removeEldestEntry()

Read more