流<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))
.
轻松地将行映射为字符
我正在尝试读取文件,计算每个字母出现的频率,然后打印结果。大写字母应被视为它们的小写字母。我有示例代码开始计算文件中不同单词的频率:
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))
.