使用Java Streams计算文件中的所有单词数

7

我试图统计一个文本文件中独特单词的数量。为了简化起见,我当前的文件内容是:

这是一个示例文件

我的尝试如下:

long wordCount = 
    Files.lines(Paths.get("sample.txt"))
         .map(line -> line.split("\\s+"))
         .distinct()
         .count();
System.out.println(wordCount);

这段代码可以编译和运行,但结果为1,实际应该是5


3
可能是如何使用Java 8风格计算文本文件中的单词数的重复问题。 - Julien Lopez
2个回答

12

你正在将每一行映射为一个数组(将一个Stream<String>转换为一个Stream<String[]>),然后计算数组元素的数量(即文件中行的数量)。

你应该使用flatMap创建一个包含文件中所有单词的Stream<String>,并在distinct()count()操作之后,您将得到不同单词的数量。

long wordCount = 
    Files.lines(Paths.get("sample.txt"))
         .flatMap(line -> Arrays.stream(line.split("\\s+")))
         .distinct()
         .count();

1
当您只想计算单词数时,不扫描换行符可能更有效率,例如在Java 9中:new Scanner(Paths.get("sample.txt")) .findAll("\\S+") .map(MatchResult::group) .distinct() .count()。这种方法的另一个优点是它不会将空行视为单词。无论哪种情况,无论您使用Files.lines还是Scanner.find,在生产代码中使用后都应关闭资源。 - Holger

7

您似乎在计算文件中的行数而不是:

map(line -> line.split("\\s+")) // this is a Stream<String[]>

您可以使用Stream.flatMap来:

long wordCount = Files.lines(Paths.get("sample.txt"))
        .map(line -> line.split("\\s+"))
        .flatMap(Arrays::stream)
        .distinct()
        .count();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接