差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

java:effective_java:lambdas_and_streams:prefer_side-effect-free_functions_in_streams [2019/07/23 22:27]
tony [Introduction & My Opinion]
java:effective_java:lambdas_and_streams:prefer_side-effect-free_functions_in_streams [2023/06/25 09:48]
行 1: 行 1:
-{{tag>​java effective_java}} 
-====== Effective Java - Prefer side-effect-free functions in streams (working..) ​ ====== 
-===== Introduction & My Opinion ===== 
-這個item要強調的是「stream中間處理過程所使用的function,應都屬於side-effect-free function」。side-effect-free function又稱為pure function,它意味著以下兩點:​ 
-  * f(x) = y,相同的x永遠都會產生相同的y;且x不能因經過這個函式後,就發生改變。 
-  * 此函式不會影響到函式以外的變數,也不會受到函式以外的變數影響。(我想const變數應不在此範圍內) 
-這樣的function會比較好維護,因為當你refactor時,它應不會"​意外地"​影響到你類別中的狀態;如果與函式以外的變數互動非常頻繁,這個function應難以修改與重複被使用。書中提及有問題的寫法如下:​ 
-<code java> 
-Map<​String,​ Long> freq = new HashMap<>​();​ 
-try (Stream<​String>​ words = new Scanner(file).tokens()) { 
- words.forEach(word -> { 
- freq.merge(word.toLowerCase(),​ 1L, Long::sum); 
- }); 
-} 
-</​code>​ 
-這個寫法濫用了stream,因為它並沒有從stream中獲得容易閱讀的好處;而且forEach適用於回報計算結果,而不是用於執行計算。修改完的結果如下:​ 
-<code java> 
-Map<​String,​ Long> freq; 
-try (Stream<​String>​ words = new Scanner(file).tokens()) { 
- freq = words 
- .collect(groupingBy(String::​toLowerCase,​ counting()));​ 
-} 
-</​code>​ 
-這裡示範了collector與method reference,讓你的code稍微清晰,但沒寫過Lambda的人可能還是看不懂這在幹嘛。這個item的重點之一就是要你去弄清楚collector toList、toSet、toMap、groupingBy和join的用法。以後有時間我在針對這部分特別做說明。 
  
- 
-===== Note ===== 
-Effective Java第三版Item 46。 
-===== Reference ===== 
-  * Effective Java, 3/e 
-  * [[https://​en.wikipedia.org/​wiki/​Pure_function|Pure function definition]] 
-=====    ===== 
----- 
-\\ 
-~~DISQUS~~