流使用介绍:
计算结构:
副作用:
示例 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中文网其他相关文章!