使用流收集 HashMap 中的事件

Collecting occurrences in a HashMap with streams

我有一个练习要解决。我有一个 Fox class,它有名称和颜色字段。我的练习是通过颜色找到狐狸出现的频率。

因此我创建了一个 HashMap,其中 String 属性将是狐狸的名字,Integer 将是事件本身:

    Map<String, Integer> freq = new HashMap<>();

完成之后,我一直在尝试用流编写代码,但我很难做到这一点。我写了这样的东西:

    foxes.stream()
    .map(Fox::getColor)
    .forEach()
    //...(continued later on);

,其中 foxes 是一个列表。

我的问题主要出在语法上。我想做一些事情,如果颜色没有出现,那么

    freq.put(Fox::getName, 1)

其他

    freq.replace(Fox::getName, freq.get(Fox::getName) + 1)

应该怎么组合?

我不建议继续使用你的方法,因为已经有一个内置的收集器用于此,即 groupingBy collector with counting() 作为下游:

 Map<String, Long> result = foxes.stream()
      .collect(Collectors.groupingBy(Fox::getName, Collectors.counting()));

这里通过"name"求频数,同样的,你可以通过改变分类函数,通过颜色得到频数。

foxes.stream()
     .collect(Collectors.groupingBy(Fox::getColor, Collectors.counting()));