You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中将List<Item>转换为Map<Integer,List<ItemDetails>>的实现及重复元素问题解决

解决List转Map<Integer, List>的重复元素问题

嘿,我一眼就看出你代码里重复元素的问题啦!你把itemDetailsList的创建放在了外层循环外面,每次处理新的id时,都会往同一个列表里追加元素,最后把这个已经累积了所有id对应元素的列表赋值给每个map的key,自然就会出现重复内容了。

修正你的原始代码

只需要把itemDetailsList的创建移到处理每个id的循环内部,每次处理新id时都新建一个空列表:

List<Integer> ids = resultBl.stream()
                            .map(Item::getId)
                            .distinct()
                            .collect(Collectors.toList());

Map<Integer, List<ItemDetails>> mapTest = new HashMap<>();

for (Integer s : ids) {
    // 每次处理新id时,新建一个空列表
    List<ItemDetails> itemDetailsList = new ArrayList<>();
    for (Item i : resultBl) {
        if (s.equals(i.getId())) {
            ItemDetails it = new ItemDetails();
            it.setAmount(i.getAmount());
            it.setNameType(i.getNameType());
            itemDetailsList.add(it);
        }
    }
    mapTest.put(s, itemDetailsList);
}

更优雅的Java Stream实现

其实Java 8+的Stream API已经提供了更简洁、不易出错的分组方式,用Collectors.groupingBy可以一步完成转换,完全不需要手动去处理id去重和循环:

Map<Integer, List<ItemDetails>> mapTest = resultBl.stream()
    .collect(Collectors.groupingBy(
        Item::getId, // 分组的key是item的id
        Collectors.mapping( // 把每个Item转换成ItemDetails
            item -> {
                ItemDetails details = new ItemDetails();
                details.setAmount(item.getAmount());
                details.setNameType(item.getNameType());
                return details;
            },
            Collectors.toList() // 把转换后的元素收集成列表
        )
    ));

这种方式不仅代码更短,还避免了手动循环可能出现的错误(比如你之前的列表复用问题),而且性能也更优——只需要遍历一次原始列表,而你的原始代码需要遍历两次(一次去重id,一次匹配元素)。

内容的提问来源于stack exchange,提问作者mak_doni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 00:57:49