【问题标题】:Stream<String> conversion to Stream<Character>Stream<String> 转换为 Stream<Character>
【发布时间】:2018-08-25 04:44:55
【问题描述】:

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

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);

但是,我想不出一种方法来使用它来转换流字符串。

【问题讨论】:

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


    【解决方案1】:

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

    在原始代码中,一行使用 .flatMap(pattern::splitAsStream) 映射为单词,但您可以轻松地将一行映射为使用 .flatMap(s -&gt; s.chars().mapToObj(i -&gt; (char)i)) 的字符。

    【讨论】:

    • 扩展一点:您只需要知道chars 会返回一个IntStream 而不是CharStream,因为它不存在(请在此处阅读原因:stackoverflow.com/questions/22435833/…)。这就是为什么你仍然需要使用mapToObj
    • 确实如此。尽管在计算它们时没有什么能阻止您将它们保留为ints,并且只有当您显示结果时,您才会将它们转换回char。并不是说它有任何显着差异,当您将 int 映射到 Characters 时,更容易看到发生了什么。
    • 完全正确。如果您可以处理整数值,则没有理由首先转换它。只是想记下这一点,因为许多人在使用名为 chars 的东西时会期望 CharStream
    • String::chars in .flatMap(String::chars) 给我错误“返回类型错误。无法将 IntStream 转换为 Stream extends R>”。
    • 糟糕,有些偏执狂。已修复,无法使用简单的方法引用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2021-07-22
    • 1970-01-01
    • 2014-07-20
    • 2019-11-08
    • 2022-11-28
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多