一个list集合里面有几条数据,但是有某几个字段可能会相同,把指定字段相同的数据合成一条,并且其中的数量字段累加,该怎么实现?
2条回答 默认 最新
- 社区专家-Monster-XH 2023-03-02 22:04关注
基于Monster 组和GPT的调写:
用Java 8 Stream API来实现将指定字段相同的数据合成一条,并且其中的数量字段累加的操作。具体步骤如下:首先,将List集合转换成Stream对象。 接着,使用Collectors.groupingBy()方法对指定字段进行分组,将具有相同字段值的数据分为同一组。 然后,使用Collectors.mapping()方法对数量字段进行映射,将每个数据对象的数量字段映射成一个新的Integer对象。 接下来,使用Collectors.reducing()方法对映射后的Integer对象进行累加操作,将同一组中的所有数量字段累加起来得到该组的总数量。 最后,使用Collectors.collectingAndThen()方法将分组后的数据转换成一个新的List集合,其中每条数据只包含指定字段相同的数据合成的一条,并且其中的数量字段为累加后的值。
假设List集合中的每个数据对象都有id、name和quantity三个字段,需要根据id字段将数据分组并且累加相同id的quantity值:
List<Data> dataList = Arrays.asList( new Data(1, "A", 10), new Data(2, "B", 20), new Data(1, "C", 30), new Data(3, "D", 40), new Data(2, "E", 50), new Data(1, "F", 60) ); Map<Integer, Integer> quantityMap = dataList.stream() .collect(Collectors.groupingBy(Data::getId, Collectors.mapping(Data::getQuantity, Collectors.reducing(0, Integer::sum)))) .entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); List<Data> result = dataList.stream() .filter(d -> quantityMap.containsKey(d.getId())) .distinct() .map(d -> new Data(d.getId(), d.getName(), quantityMap.get(d.getId()))) .collect(Collectors.toList());
用Collectors.groupingBy()方法根据id字段对数据进行分组,并使用Collectors.mapping()方法将每个数据对象的quantity字段映射成一个新的Integer对象。然后,使用Collectors.reducing()方法对映射后的Integer对象进行累加操作。最后,使用Collectors.toMap()方法将分组后的结果转换成一个Map对象,其中键为id字段值,值为相同id的quantity字段值的累加结果。
接着,使用stream()方法将List集合转换成Stream对象,使用filter()方法过滤掉不在分组后的Map对象中的数据对象,使用distinct()方法去重,最后使用map()方法将每个数据对象转换成一条新的数据对象,其中数量字段为累加后的值,并使用collect()方法将所有新的数据对象收集到一个新的List集合中。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥50 用易语言http 访问不了网页
- ¥50 safari浏览器fetch提交数据后数据丢失问题
- ¥15 matlab不知道怎么改,求解答!!
- ¥15 永磁直线电机的电流环pi调不出来
- ¥15 用stata实现聚类的代码
- ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
- ¥20 docker里部署springboot项目,访问不到扬声器
- ¥15 netty整合springboot之后自动重连失效
- ¥15 悬赏!微信开发者工具报错,求帮改
- ¥20 wireshark抓不到vlan