流使用介紹:
- 新用戶可能會發現很難在流管道中表達計算。
- Streams 基於函數式編程,提供表現力、速度和平行化。
計算結構:
- 使用純函數將結構計算作為轉換序列。
- 純函數僅依賴它們的輸入,並且不會改變狀態。
副作用:
- 避免傳遞給流操作的函數產生副作用。
- 不正確地使用改變外部狀態的 forEach 是一種「難聞的氣味」。
範例1:有副作用的程式碼
雷雷
問題:這段程式碼使用forEach來修改外部狀態(freq)。它是迭代的並且不利用流。
範例2:無副作用的程式碼
雷雷
解決方案:使用 Collectors.groupingBy 收集器建立頻率表,而不改變外部狀態。更短、更清晰、更有效率。
流API的佔用:
- 模仿迭代循環的程式碼沒有利用流。
- 使用收集器進行更有效率和可讀的操作。
收藏家:
- 簡化將結果收集到列表和集合等集合。
- Collectors.toList()、Collectors.toSet()、Collectors.toCollection(collectionFactory).
範例 3:提取最常見的十個單字的清單
雷雷
說明:
- 按值降序排列頻率圖條目。
- 將直播限制為 10 個字。
- 收集清單中最常見的單字。
收集器 API 的複雜性:
- API 有 39 個方法,但很多都是進階使用的。
- 收集器可用於建立地圖(toMap、groupingBy)。
地圖與收集攻略:
- toMap(keyMapper, valueMapper) 用於唯一的鍵值。
- 使用合併功能處理按鍵衝突的策略。
- groupingBy 根據分類器函數將元素分組。
範例4:使用有合併功能的toMap
雷雷
說明:
- toMap 將單字對應到它們的頻率。
- 合併函數(Long::sum)透過對頻率求和來處理關鍵衝突。
範例 5:按藝人分組並找出最暢銷的專輯
雷雷
說明:
- toMap 將藝術家映射到他們最暢銷的專輯。
- BinaryOperator.maxBy 決定每位藝術家的最暢銷專輯。
字串集合:
Collectors.joining 使用可選分隔符號連接字串。
範例 6:使用分隔符號連接字串
雷雷
說明:
- Collectors.joining 以逗號作為分隔符號、前綴和後綴連接字串。
- 結果:[來、看見、征服].
結論:
- 流的本質在於無副作用的函數。
- forEach 只能用於報告結果。
- 有關收集器的知識對於有效使用流至關重要。
以上是Item 優先選擇流中沒有副作用的函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!