Java中list集合使用

一个list集合里面有几条数据,但是有某几个字段可能会相同,把指定字段相同的数据合成一条,并且其中的数量字段累加,该怎么实现?

基于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集合中。

可以通过遍历list,使用Map来实现。具体步骤如下:

  1. 定义一个Map,以指定字段的值为key,以合并后的对象为value。
  2. 遍历list中的元素,根据指定字段的值来判断该元素是否已经在Map中存在,如果不存在,则直接将该元素放入Map中;如果存在,则将该元素的数量字段累加到Map中已有的元素中。
  3. 最后将Map中的value转成List返回即可。

示例代码如下:

public static List<Item> mergeList(List<Item> list) {
    Map<String, Item> map = new HashMap<>();
    for (Item item : list) {
        String key = item.getKey(); // 指定字段的值
        if (map.containsKey(key)) {
            Item existingItem = map.get(key);
            existingItem.setNum(existingItem.getNum() + item.getNum()); // 累加数量字段
        } else {
            map.put(key, item);
        }
    }
    return new ArrayList<>(map.values());
}

其中,Item是具体的数据对象,包含了指定字段和数量字段的属性。