Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java8流:使用聚合进行分组_Java_Group By_Java Stream_Aggregation - Fatal编程技术网

Java8流:使用聚合进行分组

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

在以下方面,我很难找到使用流API的好方法/实现:

我有一个元素列表,每个元素由一个字符串和一个整数组成。现在我喜欢按字符串值对元素进行分组,然后对于每个组,我喜欢得到与该组相关的元素的整数值之和

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

("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)
    ));