整理 Effective Java 書中 Item 48: Use streams judiciously 心得筆記
主旨:parallel stream 用錯,效能與正確性可能雙雙出問題
Java 8 的 stream API 帶來了非常方便的資料處理方式,加上 .parallel() 方法,更是讓你只用一行就能平行運算聽起來很香。
但實際上呢?用錯地方,不僅效能沒提升,甚至會程式掛掉。平行化是進階優化技巧,不是萬靈丹。
整理 Effective Java 書中 Item 48: Use streams judiciously 心得筆記
Java 8 的 stream API 帶來了非常方便的資料處理方式,加上 .parallel() 方法,更是讓你只用一行就能平行運算聽起來很香。
但實際上呢?用錯地方,不僅效能沒提升,甚至會程式掛掉。平行化是進階優化技巧,不是萬靈丹。
整理 Effective Java 書中 Item 47: Prefer Collection to Stream 心得筆記
Java 8 推出 streams 之後,我們在設計方法時有了新的回傳型別選擇。不過,若你要回傳一串元素,Collection 或其子型別通常仍是最合適的選擇,因為這樣使用者不論是想用 for-each 迴圈還是用 stream pipeline,都能方便操作。除非真的有特殊理由,否則不要只回傳 Stream。
整理 Effective Java 書中 Item 46: Prefer side-effect-free functions in streams 心得筆記
Java 的 streams API 雖然語法簡潔、功能強大,但若沒有掌握其「函數式編程」的核心精神,寫出來的程式碼可能又臭又長、難讀又難維護。本篇要講的,就是 streams 最重要的設計原則:偏好無副作用的函式(side-effect-free functions)。
簡單來說,「副作用」是指函式除了回傳值之外,還會修改外部狀態。例如把某個值加進 map 或 list,就是副作用。真正的函數式風格應該避免這種做法,讓每個階段的處理都只是資料的轉換,不牽涉修改其他東西。
整理 Effective Java 書中 Item 45: Use streams judiciously 心得筆記
Java 8 推出的 streams API 是用來處理「大量資料的處理流程」的工具,它支援類似函式式的操作(例如 map、filter、collect 等),並能以流暢的語法串接多個處理階段。然而,streams 是一把雙面刃:用得好能讓程式簡潔清楚,用不好會讓人看不懂又難維護。
本篇要講的重點就是:該用的時候再用,避免過度使用。
stream pipeline 可以寫得很精簡,例如:
整理 Effective Java 書中 Item 44: Use standard functional interfaces 心得筆記
從 Java 8 開始,因為 lambda 的加入,我們寫 API 的思維也隨之改變。如果你需要傳入一段行為(function object),不再需要額外建立匿名類別,而是可以用 lambda 寫得更簡潔。但要寫出真正好用的 API,選對函式介面更是關鍵,盡可能用 Java 內建的標準函式介面,能讓程式碼更直觀、可讀性更高,也方便 IDE 自動補全與檢查。
假設你想要建立一個可限制最大筆數的快取,會用 LinkedHashMap 來實作,並覆寫 removeEldestEntry():