Java使用CSVRecord时如何去除重复对象属性并合并同品牌颜色列表
问题根因
现有代码的逻辑存在两处错误导致品牌重复、颜色未合并:
- 分组key使用完整
Car对象:@Data注解会用所有属性计算equals/hashCode,你每次构建的Car的color是单元素列表,同品牌不同颜色的Car会被判定为不同对象,无法分到同一组。 - 未做颜色合并逻辑:分组后直接复用了原单个
Car的单颜色列表,没有合并同品牌的所有颜色。
修改方案
分组时直接用品牌字符串作为key,分组过程中直接收集同一品牌的所有颜色,最后转换为Car列表即可,修改后的代码如下:
public List<Car> convert(List<CSVRecord> csvRecordList) { // 按品牌分组,收集对应所有颜色 Map<String, List<String>> brandColorMap = csvRecordList.stream() .collect(Collectors.groupingBy( record -> record.get("brand"), Collectors.mapping(record -> record.get("color"), Collectors.toList()) )); // 转换为Car对象列表 return brandColorMap.entrySet().stream() .map(entry -> Car.builder() .brand(entry.getKey()) .color(entry.getValue()) .build()) .collect(Collectors.toList()); }
可选优化(同品牌颜色去重)
如果需要避免同一品牌出现重复颜色,可以修改颜色收集逻辑,先转Set去重再转List:
public List<Car> convert(List<CSVRecord> csvRecordList) { Map<String, List<String>> brandColorMap = csvRecordList.stream() .collect(Collectors.groupingBy( record -> record.get("brand"), Collectors.mapping(record -> record.get("color"), Collectors.collectingAndThen(Collectors.toSet(), ArrayList::new)) )); return brandColorMap.entrySet().stream() .map(entry -> Car.builder() .brand(entry.getKey()) .color(entry.getValue()) .build()) .collect(Collectors.toList()); }
内容的提问来源于stack exchange,提问作者LinebakeR
相关产品推荐
相关产品推荐

