大佬,救命 2023-03-02 21:48 采纳率: 50%
浏览 26
已结题

Java中list集合使用

一个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条)

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 创建了问题 3月2日

悬赏问题

  • ¥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