使用流收集 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()));
我有一个练习要解决。我有一个 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()));