Java8流:使用聚合进行分组
在以下方面,我很难找到使用流API的好方法/实现: 我有一个元素列表,每个元素由一个字符串和一个整数组成。现在我喜欢按字符串值对元素进行分组,然后对于每个组,我喜欢得到与该组相关的元素的整数值之和 示例:我有以下3个元素:Java8流:使用聚合进行分组,java,group-by,java-stream,aggregation,Java,Group By,Java Stream,Aggregation,在以下方面,我很难找到使用流API的好方法/实现: 我有一个元素列表,每个元素由一个字符串和一个整数组成。现在我喜欢按字符串值对元素进行分组,然后对于每个组,我喜欢得到与该组相关的元素的整数值之和 示例:我有以下3个元素: ("GroupA", 100) ("GroupA", 50) ("GroupB", 10) 因此,我希望得到一个由以下两对(键、值)组成的映射: 我不知道如何解决这个问题。到目前为止,我想到的最有希望的是: elements.stream().collect(Collect
("GroupA", 100) ("GroupA", 50) ("GroupB", 10)
因此,我希望得到一个由以下两对(键、值)组成的映射:
我不知道如何解决这个问题。到目前为止,我想到的最有希望的是:
elements.stream().collect(Collectors.groupingBy(e-> e.getGroup()))
.merge(group, elementsOfTheGroup, (...));
但是我不确定插入什么函数作为merge方法的最后一个参数。但是我不知道我是否应该使用merge方法
对此,最优雅的实现是什么?您需要向其添加一个下游收集器。此收集器收集分类到同一密钥的所有元素。在本例中,我们只需要使用将所有数字相加,映射器是一个返回要求和的数字的函数 假设可以使用getter
getNumber()
检索此数字,则可以:
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
e -> e.getGroup(),
Collectors.summingInt(e -> e.getNumber())
));
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
e -> e.getGroup(),
Collectors.summingInt(e -> e.getNumber())
));
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
Element::getGroup,
Collectors.summingInt(Element::getNumber)
));