list通过里面对象的某个属性分组或者分组汇总

本文介绍了 Java Stream API 的多种实用场景,包括根据属性进行分组、求和、过滤、匹配及转换等操作,帮助开发者更高效地处理集合数据。

1,跟据某个属性分组OfficeId

 Map<String, List<IncomeSumPojo>> collect = list.stream().collect(Collectors.groupingBy(IncomeSumPojo::getOfficeId));

2,根据某个属性分组OfficeId,汇总某个属性Money

Map<String, Double> collect = list.stream().collect(Collectors.groupingBy(IncomeSumPojo::getOfficeId,Collectors.summingDouble(IncomeSumPojo::getMoney)));

3,根据某个属性添加条件过滤数据,

list = list.stream().filter(u -> !u.getAmount().equals("0.00")).collect(Collectors.toList());

4,判断一组对象里面有没有属性值是某个值

List<Menu> menuList = UserUtils.getMenuList();
boolean add = menuList.stream().anyMatch(m -> "plan:ctPlan:add".equals(m.getPermission()));

5,取出一组对象的某个属性组成一个新集合

List<String> tableNames=list.stream().map(User::getMessage).collect(Collectors.toList());

6,list去重复

list = list.stream().distinct().collect(Collectors.toList());

 

### 使用 Java Stream 对 List对象字段分组并聚合 在 Java 8 及更高版本中,`Stream API` 提供了强大的集合操作能力,其中 `Collectors.groupingBy` 是实现按对象字段分组的核心工具。通过结合其他收集器(如 `Collectors.summingDouble`、`Collectors.counting` 或 `Collectors.mapping`),可以完成多种类型的聚合操作。 #### 基本分组与计数 若需对一个对象列表按照某个字段进行分组,并统计每组的元素数量,可使用如下方式: ```java Map<String, Long> countByField = list.stream() .collect(Collectors.groupingBy(Object::getField, Collectors.counting())); ``` 该方法适用于如统计不同年级的学生人数等场景[^1]。 #### 分组后提取属性列表 在某些情况下,除了分组外,还需提取每组中的特定属性值组成列表。例如,将学生按年级分组后提取各组的学生姓名: ```java Map<String, List<String>> namesByField = list.stream() .collect(Collectors.groupingBy( Object::getField, Collectors.mapping(Object::getSubField, Collectors.toList()) )); ``` 这种方式适合用于构建分组后的映射结构,便于后续查询和展示[^1]。 #### 分组后求和或聚合数值 若对象中包含数值型字段,如销售额、收入等,可使用 `Collectors.summingDouble` 实现分组后的求和操作: ```java Map<String, Double> sumByField = list.stream() .collect(Collectors.groupingBy( Object::getField, Collectors.summingDouble(Object::getValue) )); ``` 此方法适用于按产品类型汇总销售额、按地区统计销售总额等业务需求[^1]。 #### 多字段分组与复合聚合 当需要根据多个字段组合进行分组时,可构造一个复合键(通常为 `Map.Entry` 或自定义类)作为分组依据,并结合多种聚合函数: ```java Map<Map.Entry<String, Integer>, Double> result = list.stream() .collect(Collectors.groupingBy( obj -> new AbstractMap.SimpleEntry<>(obj.getField1(), obj.getField2()), Collectors.summingDouble(Object::getValue) )); ``` 此类操作常用于复杂的数据分析任务,如按地区和时间维度统计销售数据[^2]。 #### 并行流优化性能 对于大规模数据集,可通过 `parallelStream()` 替代 `stream()` 启用并行处理,以提升分组与聚合效率: ```java Map<String, Long> countByFieldParallel = list.parallelStream() .collect(Collectors.groupingBy(Object::getField, Collectors.counting())); ``` 但需注意,是否启用并行应基于实际数据量及硬件资源综合评估,避免线程竞争带来的性能损耗。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值