java8 stream 中利用 groupingby 进行多字段分组求和案例
时间: 2023-06-05 18:47:36 浏览: 2409
Java 8引入了Stream API,有许多新方法,其中有一个对于分组和聚合操作非常有用,那就是groupingBy()方法。它可以将一个流分组成一个Map,其中Entry的key是分组的条件,value是分组的结果,通常是一个List或其他集合。groupingBy()方法的另一个形式是groupingByConcurrent(),它返回一个并发Map,对于并发访问更加友好。
利用groupingBy()方法进行多字段分组和求和操作的示例如下:
假设有一个Person类,其中包含属性:name, age和salary。现在我们需要根据name和age两个字段进行分组,并求出每组的salary总和。可以使用groupingBy()方法加上summingDouble()方法来实现:
```
List<Person> persons = Arrays.asList(
new Person("Tom", 20, 5000),
new Person("Tom", 21, 4000),
new Person("Jerry", 22, 6000),
new Person("Jerry", 23, 5500),
new Person("Kate", 24, 7000),
new Person("Kate", 25, 8000)
);
Map<String, Map<Integer, Double>> result = persons.stream()
.collect(Collectors.groupingBy(Person::getName,
Collectors.groupingBy(Person::getAge,
Collectors.summingDouble(Person::getSalary))));
```
这里的personList是一个包含了6个Person对象的List,我们希望将其中相同name和age的对象分组,求得salary的总和。在groupingBy()方法中,第一个参数是分组条件,这里是Person::getName,第二个参数是分组的结果,这里是一个嵌套的groupingBy()方法,用于再次按照age进行分组,结果是一个Map<Integer, Double>。最后,我们使用summingDouble()方法对salary字段进行求和,得到各个分组的salary总和。这里的result是一个Map<String, Map<Integer, Double>>类型的对象,其中key是name,value是以age为key,salary总和为value的子Map,就是我们需要的结果。
这样,我们就利用Java 8中的Stream API和groupingBy()方法进行了多字段分组和求和操作,代码简洁,可读性强,非常方便。
阅读全文
相关推荐

















