collectors.groupingby以后累加
时间: 2023-09-13 17:08:12 浏览: 77
在使用Java 8中的`Collectors.groupingBy()`方法进行分组后,可以使用`Collectors.summingInt()`方法对每个分组的值进行累加。例如,如果我们有一个`List`对象,其中包含多个`Person`对象,我们可以按照他们的年龄进行分组,并对每个组的年龄进行累加,如下所示:
```java
Map<String, Integer> ageSumByCity = persons.stream()
.collect(Collectors.groupingBy(Person::getCity,
Collectors.summingInt(Person::getAge)));
```
上面的代码将把`persons`列表中的人按照城市分组,并计算每个城市的年龄总和。这将返回一个`Map`,其中键是城市名称,值是该城市中所有人的年龄总和。这里假设`Person`类有`getCity()`和`getAge()`方法来获取城市和年龄信息。
相关问题
Collectors.groupingBy 分组然后对BigDecimal类型的数字求和
`Collectors.groupingBy` 是 Java Stream API 中的一个收集操作,它用于根据指定键将元素分组,并对每个分组应用定制的操作。如果你想要对 `BigDecimal` 类型的数字进行分组并计算每组的总和,可以按照以下步骤操作:
首先,假设你有一个列表(List<YourClass>)其中包含 `YourClass` 对象,每个对象有 key 和 BigDecimal 类型的 value,你可以这样做:
```java
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
class YourClass {
String key;
BigDecimal value;
// ...其他属性...
}
List<YourClass> yourList = ...; // 你的 BigDecimal 数字列表
// 使用 groupingBy 进行分组,summingBigDecimal 作为每个组内的求和操作
Map<String, BigDecimal> groupedAndSummed = yourList.stream()
.collect(Collectors.groupingBy(YourClass::getKey,
Collectors.reducing(BigDecimal.ZERO, YourClass::getValue, BigDecimal::add)));
// groupedAndSummed 现在是一个 Map,key 是 group 的标识,value 是该组内所有值的总和
```
这里的关键在于 `Collectors.reducing()` 函数,它接受一个初始值(这里是零),一个累积函数(在这里是添加操作 `BigDecimal::add`)以及合并两个值的函数(也是加法)。这样每个 group 的值就会累加起来。
Map<Integer, BigDecimal> sumByType = holderShareRespVos.stream() .collect(Collectors.groupingBy(A::getType, Collectors.mapping(A::getMoney, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))); 这一行仔细解释一下
这行代码使用 Java 8 中的 Stream API 对 `holderShareRespVos` 进行操作,实现按照 `A` 对象的类型 (`type`) 进行分组,并计算每个类型对应的金钱和。
具体解释如下:
- `holderShareRespVos.stream()`: 将 `holderShareRespVos` 转换为一个流,以便对其中的元素进行操作。
- `collect(...)`: 使用 `collect` 方法将流中的元素进行收集操作。
- `Collectors.groupingBy(A::getType, ...)`: 使用 `groupingBy` 收集器,根据 `A` 对象的类型 (`type`) 进行分组。这将返回一个 `Map<Integer, List<A>>`,其中键是类型值,值是该类型对应的对象列表。
- `Collectors.mapping(A::getMoney, ...)`: 使用 `mapping` 收集器,将每个分组内的 `A` 对象映射为其对应的金钱值 (`money`)。
- `Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)`: 使用 `reducing` 收集器,将每个分组内的金钱值进行累加操作。初始值为 `BigDecimal.ZERO`,并使用 `BigDecimal::add` 方法将每个值相加。
- 最终的结果是一个 `Map<Integer, BigDecimal>`,其中键是类型值,值是该类型对应的金钱和。
总而言之,这行代码通过 Stream API 实现了对 `holderShareRespVos` 中的对象进行分组,并计算每个类型对应的金钱和。
阅读全文