流<String> 转换为流<Character>

Stream<String> conversion to Stream<Character>

我正在尝试读取文件,计算每个字母出现的频率,然后打印结果。大写字母应被视为它们的小写字母。我有示例代码开始计算文件中不同单词的频率:

Pattern pattern = Pattern.compile("\s+");
Map<String, Long> wordCounts =
        Files.lines(Paths.get("myFile.txt"))
                .flatMap(pattern::splitAsStream)
                .collect(Collectors.groupingBy(String::toLowerCase, TreeMap::new, Collectors.counting()));

我要修改此代码以改为计算字母。我相信我的大部分困难在于理解随着代码的进行对象会变成什么,以及我可以用结果做什么。我知道 Files.lines() 输出一个流字符串,其中每个字符串实际上是文件中的一行。从 this answer,我知道我可以使用以下代码将字符串转换为流字符:

Stream<Character> sch = "abc".chars().mapToObj(i -> (char)i);

但是,我不太清楚如何使用它来转换流字符串。

使用 flatMap() 您可以将流元素映射到新流中。

在原始代码中,使用 .flatMap(pattern::splitAsStream) 将一行映射为单词,但您可以使用 .flatMap(s -> s.chars().mapToObj(i -> (char)i)).

轻松地将行映射为字符