一个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无用