流使用介紹:
計算結構:
副作用:
範例 1:有副作用的程式碼
Map<String, Long> freq = new HashMap<>(); try (Stream<String> words = new Scanner(file).tokens()) { words.forEach(word -> { freq.merge(word.toLowerCase(), 1L, Long::sum); }); }
問題:此程式碼使用 forEach 修改外部狀態(freq)。它是迭代的並且不利用流。
範例 2:無副作用的程式碼
Map<String, Long> freq; try (Stream<String> words = new Scanner(file).tokens()) { freq = words.collect(Collectors.groupingBy(String::toLowerCase, Collectors.counting())); }
解決方案: 使用 Collectors.groupingBy 收集器建立頻率表而不更改外部狀態。更短、更清晰、更有效率。
佔用流 API:
收藏家:
範例 3:擷取最常見的 10 個單字的清單
List<String> topTen = freq.entrySet().stream() .sorted(Map.Entry.<String, Long>comparingByValue().reversed()) .limit(10) .map(Map.Entry::getKey) .collect(Collectors.toList());
說明:
收集器 API 的複雜性:
地圖與收集策略:
範例 4:使用合併功能的 toMap
Map<String, Long> freq; try (Stream<String> words = new Scanner(file).tokens()) { freq = words.collect(Collectors.toMap( String::toLowerCase, word -> 1L, Long::sum )); }
說明:
範例 5:按藝人分組並找出最暢銷的專輯
Map<Artist, Album> topAlbums = albums.stream() .collect(Collectors.toMap( Album::getArtist, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(Album::sales)) ));
說明:
字串集合:
Collectors.joining 將字串與可選分隔符號連接起來。
範例 6:使用分隔符號連接字串
String result = Stream.of("came", "saw", "conquered") .collect(Collectors.joining(", ", "[", "]"));
說明:
結論:
以上是Item 優先選擇流中沒有副作用的函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!