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

Java使用CSVRecord时如何去除重复对象属性并合并同品牌颜色列表

问题根因

现有代码的逻辑存在两处错误导致品牌重复、颜色未合并:

  1. 分组key使用完整Car对象:@Data注解会用所有属性计算equals/hashCode,你每次构建的Car的color是单元素列表,同品牌不同颜色的Car会被判定为不同对象,无法分到同一组。
  2. 未做颜色合并逻辑:分组后直接复用了原单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:54:06