java - Stream<String> 转换为 Stream<Character>

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

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

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

最佳答案

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

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

关于java - Stream<String> 转换为 Stream<Character>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49315272/

相关文章:

javascript - 将具有逻辑和用户界面的函数转换为高阶函数

recursion - Dhall 中的整数除法

javascript - Node.js 将相同的可读流传输到多个(可写)目标

java - 泛型的使用

java - 使用 Jackson 创建像 JSON.org 这样的简单对象

java - 如何使用 byte-buddy 在运行时覆盖对象的值

scala - 在 scalaz 中组合状态的标准方法

java - 如何尝试从 java 客户端使用 Sharepoint 的 Rest api 但收到状态代码 403 Forbidden

java - 如何在 Java 中将 InputStream 转换为 String?

c# - IEnumerable 作为流发出?