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
相关产品推荐
相关产品推荐

