如何计算 groupBy 的发生次数?

2022-08-31 05:50:19

我想将流中的项目收集到一个映射中,该映射将相等的对象组合在一起,并映射到出现次数。

List<String> list = Arrays.asList("Hello", "Hello", "World");
Map<String, Long> wordToFrequency = // what goes here?

因此,在这种情况下,我希望地图由以下条目组成:

Hello -> 2
World -> 1

我该怎么做?


答案 1

我认为你只是在寻找重载,这需要另一个人来指定如何处理每个组......然后进行计数:CollectorCollectors.counting()

import java.util.*;
import java.util.stream.*;

class Test {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        list.add("Hello");
        list.add("Hello");
        list.add("World");

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

        System.out.println(counted);
    }
}

结果:

{Hello=2, World=1}

(使用也有可能提高效率。对于您的真实代码,如果它在您的上下文中是安全的,请牢记一些事情。groupingByConcurrent


答案 2

以下是对象列表的示例

Map<String, Long> requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting()));