java - 如何使用 Collectors.collectionAndThen 和 Collect

以下面的列表为例:

List<String> input = List.of("FOO", "FOO", "FOO", "FOO", "FOO", "BAR", "BAR", "BAZ", "BAZ", "BAZ", "DOO", "DOO"); 

我需要获取每个元素的相对频率并将其打印为字符串格式。为此,我使用了 2 个步骤,首先创建一个频率图,然后计算相对百分比和格式:

Map<String, Long> relativeFrequency =
        input.stream().collect(Collectors.groupingBy(Function.identity(),Collectors.counting()));

Map<String, String> relativeFrequency2 = relativeFrequency.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey,
                entry -> String.format ( "%.02f%%", entry.getValue() * 100.  / input.size() )));

System.out.println(relativeFrequency2);

并得到结果

{BAR=16.67%, DOO=16.67%, FOO=41.67%, BAZ=25.00%}

我被告知要重构上述内容并使用 Collectors.collectionAndThen 一次性完成,但我似乎找不到正确的语法(编译错误 Operator '*' cannot be applied to '<lambda parameter>', 'double')。有人可以帮助更正以下内容以获得与上述相同的结果吗?

Map<String, String> relativeFrequency3 = 
input.stream().collect(Collectors.collectingAndThen(Collectors.groupingBy(Function.identity(), Collectors.counting(),
                total -> String.format ( "%.02f%%", total * 100.  / input.size() ))
));

最佳答案

你很接近。

List<String> input =
        List.of("FOO", "FOO", "FOO", "FOO", "FOO", "BAR",
                "BAR", "BAZ", "BAZ", "BAZ", "DOO", "DOO");
  • collectingAndThen 的第一个参数是 counting() 以获得频率。
  • 然后您通过将频率转换为格式化的百分比来处理该频率。
Map<String, String> map = input.stream().collect(Collectors
        .groupingBy(a -> a, Collectors.collectingAndThen(
                Collectors.counting(),
                count -> "%.2f%%".formatted((double) count
                        / input.size() * 100))));
        
map.entrySet().forEach(System.out::println);

打印每个条目集产生

BAR=16.67%
DOO=16.67%
FOO=41.67%
BAZ=25.00%

关于java - 如何使用 Collectors.collectionAndThen 和 Collectors.groupingBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71804304/

相关文章:

javascript - Vue 3 - "Failed to resolve component"

c++ - 临时初始化和引用初始化

c# - 使用 EF Core 按 Id 检索实体的通用方法

typescript - 类型错误 : Cannot find module 'firebase-f

node.js - 如何在某个日期之前安装 Node 包及其依赖项?

c - 你怎么能告诉计算机它正在添加而没有 addl 在程序集中

ios - 什么时候在 ios 中选择 serialQueue 而不是并发队列

android - 我无法将 Android 项目从 Delphi 10.4 迁移到 Delphi

kubernetes - kubectl 等到 pod 消失(终止)

node.js - Remix.run 不使用 node.js 作为后端吗?