Java 8 流式处理:通过聚合进行分组
Java 8 Streaming: Grouping with aggregation
我在使用 Stream API 找到好的 approach/implementation 时遇到了一些问题:
我有一个元素列表,每个元素由一个字符串和一个整数组成。现在我喜欢按字符串值对元素进行分组,然后对于每个组,我希望得到与该组相关的元素的整数值的总和。
示例:我有以下 3 个元素:
("GroupA", 100) ("GroupA", 50) ("GroupB", 10)
因此我想得到一个由以下两个(键,值)对组成的映射:
("GroupA, 150) ("GroupB, 10)
我不确定如何解决这个问题。到目前为止我想到的最有前途的是:
elements.stream().collect(Collectors.groupingBy(e-> e.getGroup()))
.merge(group, elementsOfTheGroup, (...));
但我不确定要插入什么函数作为合并方法的最后一个参数。但是我不知道我是否应该使用合并方法。
对此最优雅的实现是什么?
您需要将下游收集器添加到 Collectors.groupingBy(classifier, downstream)
. This collectors collects all elements that were classified to the same key. In this case, we just need to sum all the numbers together using Collectors.summingInt(mapper)
,映射器是一个返回要求和的数字的函数。
假设可以使用 getter getNumber()
检索此号码,您可以:
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
e -> e.getGroup(),
Collectors.summingInt(e -> e.getNumber())
));
您可以使用方法引用来代替上面的两个 lambda。例如,如果元素的 class 是 Element
,您将有
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
Element::getGroup,
Collectors.summingInt(Element::getNumber)
));
我在使用 Stream API 找到好的 approach/implementation 时遇到了一些问题:
我有一个元素列表,每个元素由一个字符串和一个整数组成。现在我喜欢按字符串值对元素进行分组,然后对于每个组,我希望得到与该组相关的元素的整数值的总和。
示例:我有以下 3 个元素:
("GroupA", 100) ("GroupA", 50) ("GroupB", 10)
因此我想得到一个由以下两个(键,值)对组成的映射:
("GroupA, 150) ("GroupB, 10)
我不确定如何解决这个问题。到目前为止我想到的最有前途的是:
elements.stream().collect(Collectors.groupingBy(e-> e.getGroup()))
.merge(group, elementsOfTheGroup, (...));
但我不确定要插入什么函数作为合并方法的最后一个参数。但是我不知道我是否应该使用合并方法。
对此最优雅的实现是什么?
您需要将下游收集器添加到 Collectors.groupingBy(classifier, downstream)
. This collectors collects all elements that were classified to the same key. In this case, we just need to sum all the numbers together using Collectors.summingInt(mapper)
,映射器是一个返回要求和的数字的函数。
假设可以使用 getter getNumber()
检索此号码,您可以:
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
e -> e.getGroup(),
Collectors.summingInt(e -> e.getNumber())
));
您可以使用方法引用来代替上面的两个 lambda。例如,如果元素的 class 是 Element
,您将有
Map<String, Integer> result =
elements.stream().collect(Collectors.groupingBy(
Element::getGroup,
Collectors.summingInt(Element::getNumber)
));