用flatmap配合arrays.stream统计词频,先按行切分再拆单词,经flatmap扁平化后过滤空串、转小写,最后用groupingby+counting汇总。

用 flatMap 配合 Arrays.stream 统计文章词频,核心在于把每行(或每句)拆成单词流,再扁平化成一个统一的单词流,最后用 Collectors.groupingBy 计数。
先按行切分,再逐行拆单词
文章通常是多行字符串,需先用 split("\n") 或 lines() 转为行流;对每一行,用 split("\s+") 切出单词,再用 Arrays.stream(...) 转成子流,最后靠 flatMap 合并所有单词。
- 推荐用
String::lines处理换行,更安全(自动适配不同系统换行符) - 单词分割建议用正则
"\W+"或"[^a-zA-Z]+"过滤标点,比单纯"\s+"更准 - 统一转小写便于忽略大小写统计:
String::toLowerCase
过滤空字符串和纯空白
拆分后容易产生空串(如连续空格、行首尾空格),必须用 filter(word -> !word.isEmpty()) 剔除,否则会影响统计结果。
Java Linux版下载入口,提供 Oracle JDK 26.0.2 官方 Linux 安装包、Java 环境配置、JDBC 数据库连接和 Java 服务端开发相关信息。
- 也可用
filter(Predicate.not(String::isBlank))(Java 11+) - 避免在
split后直接 collect,漏掉空值会导致NullPointerException
汇总词频用 groupingBy + counting
扁平化得到完整单词流后,调用 collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 即可生成 Map<string long></string>。
-
Function.identity()表示以单词本身为 key -
Collectors.counting()返回Long类型计数,比summingInt(i -> 1)更简洁 - 若需按频次降序排列,后续可对 map 的 entrySet 排序,Stream 不直接支持
完整可运行示例
假设输入字符串 text = "Hello world\nHello Java world";:
Map<string long> wordCount = Arrays.stream(text.split("\n")) // 按行切
.flatMap(line -> Arrays.stream(line.split("\W+"))) // 每行拆词 → 扁平化
.filter(word -> !word.isEmpty()) // 去空
.map(String::toLowerCase) // 统一小写
.collect(Collectors.groupingBy(
Function.identity(),
Collectors.counting()
));</string>
结果为:{hello=2, world=2, java=1}。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










