Java 8流:聚合分组

6

我希望您能够使用Stream API找到一个好的方法/实现来处理以下内容:

我有一个元素列表,每个元素包含一个字符串和一个整数。现在我想按照它们的字符串值对元素进行分组,然后对于每个组,我想要与该组相关的元素的整数值之和。

例如:我有以下3个元素:

("GroupA", 100) ("GroupA", 50) ("GroupB", 10)

因此,我希望得到一个由以下两个(键,值)对组成的地图:

("GroupA, 150) ("GroupB, 10)

我不确定如何解决这个问题。目前为止,我想到的最有前途的方法是:

elements.stream().collect(Collectors.groupingBy(e-> e.getGroup()))
            .merge(group, elementsOfTheGroup, (...));

但我不确定在merge方法的最后一个参数中应该插入什么函数。但我也不知道是否应该使用merge方法。

什么实现方式最优雅?

1个回答

9
你需要向Collectors.groupingBy(classifier, downstream)添加一个下游收集器。该收集器将所有被分类为相同键的元素收集起来。在这种情况下,我们只需要使用Collectors.summingInt(mapper)将所有数字相加,其中mapper是返回要求和数字的函数。
假设可以通过getter getNumber()检索此数字,则可以编写以下代码:
Map<String, Integer> result =
    elements.stream().collect(Collectors.groupingBy(
        e -> e.getGroup(),
        Collectors.summingInt(e -> e.getNumber())
    ));

您可以使用方法引用而不是上面的两个lambda表达式。例如,如果元素的类为Element,则应该写成:
Map<String, Integer> result =
    elements.stream().collect(Collectors.groupingBy(
        Element::getGroup,
        Collectors.summingInt(Element::getNumber)
    ));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接