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

时间:2019-01-09 06:43:09

标签: java java-8 java-stream word distinct-values

我试图计算文本文件中唯一词的数量。为了简单起见,我当前的文件内容为:

  

这是一个示例文件

我的尝试是:

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

这可以编译并正常运行,但结果为1,而应为5

2 个答案:

答案 0 :(得分: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 :(得分: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();