差異處
這裏顯示兩個版本的差異處。
java:effective_java:lambdas_and_streams:prefer_side-effect-free_functions_in_streams [2019/07/22 23:01] 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中獲得容易閱讀的好處;修改完的結果如下: | ||
- | <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的人可能還是看不懂這在幹嘛。 | ||
- | |||
- | ===== Note ===== | ||
- | Effective Java第三版Item 46。 | ||
- | ===== Reference ===== | ||
- | * Effective Java, 3/e | ||
- | * [[https://en.wikipedia.org/wiki/Pure_function|Pure function definition]] | ||
- | ===== ===== | ||
- | ---- | ||
- | \\ | ||
- | ~~DISQUS~~ |