将<string>转换为Stream <character>

时间:2018-03-16 07:30:47

标签: java functional-programming stream java-stream boxing

我正在尝试从文件中读取,计算每个字母的频率,并打印结果。大写字母应视为小写字母。我有一个示例代码,用于计算文件中不同单词的频率:

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()输出一个Stream String,其中每个String实际上是文件中的一行。从this answer开始,我知道我可以使用以下代码将字符串转换为流字符:

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

但是,我无法找到一种方法来使用它来转换流字符串。

1 个答案:

答案 0 :(得分:4)

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

在原始代码中,一行会映射到.flatMap(pattern::splitAsStream)的字词,但您可以轻松地将该行映射到.flatMap(s -> s.chars().mapToObj(i -> (char)i))的字符。