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

如何优化Car类到Property类的属性映射?含MapStruct方案咨询

使用MapStruct优化Car到List的映射方案

问题背景

现有两个Java类定义:

public class Car {
    // fields
    private String type;
    private String model;
    private String color;
    
    // 省略getter/setter方法
}
public class Property {
    private String propertyName;
    private String propertyVal;
    
    // 省略getter/setter方法
}

当前手动实现的映射方法虽能正常运行,但后续为Car新增字段时,会导致代码重复冗余:

private List<Property> mapCarProperties(Car car) {
    List<Property> properties = new ArrayList<>();
    Property type = new Property();
    type.setPropertyName("type");
    type.setPropertyVal(car.getType());

    Property modelValue = new Property();
    modelValue.setPropertyName("modelValue");
    modelValue.setPropertyVal(car.getModel());

    Property colorType = new Property();
    colorType.setPropertyName("colorType");
    colorType.setPropertyVal(car.getColor());

    properties.add(type);
    properties.add(modelValue);
    properties.add(colorType);
    
    return properties;
}

可以用MapStruct实现,以下是具体落地方案

MapStruct通过注解自动生成映射代码,后续新增字段只需少量配置,无需重复编写模板代码,完美解决冗余问题。

1. 引入MapStruct依赖

以Maven为例,在项目pom.xml中添加依赖:

<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
    <version>1.5.5.Final</version>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
    <version>1.5.5.Final</version>
    <scope>provided</scope>
</dependency>

2. 定义映射器接口

创建MapStruct映射器接口,封装Car到List的转换逻辑:

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.ArrayList;
import java.util.List;

@Mapper
public interface CarPropertyMapper {
    // 单例实例,供业务代码调用
    CarPropertyMapper INSTANCE = Mappers.getMapper(CarPropertyMapper.class);

    default List<Property> carToPropertyList(Car car) {
        List<Property> properties = new ArrayList<>();
        
        // 映射type字段
        properties.add(createProperty("type", car.getType()));
        // 映射model字段,对应自定义propertyName
        properties.add(createProperty("modelValue", car.getModel()));
        // 映射color字段,对应自定义propertyName
        properties.add(createProperty("colorType", car.getColor()));
        
        return properties;
    }

    // 通用工具方法,统一创建Property实例
    default Property createProperty(String propertyName, String propertyVal) {
        Property property = new Property();
        property.setPropertyName(propertyName);
        property.setPropertyVal(propertyVal);
        return property;
    }
}

3. 业务代码中调用映射器

直接通过映射器实例完成转换,无需再写手动映射的冗余代码:

// 假设已有Car实例car
List<Property> properties = CarPropertyMapper.INSTANCE.carToPropertyList(car);

4. 新增字段时的维护

当Car类新增字段(比如private String brand;),只需在carToPropertyList方法中添加一行:

properties.add(createProperty("brandKey", car.getBrand()));

MapStruct会自动生成对应的实现代码,无需重复编写创建Property、设置属性的模板逻辑。

进阶优化:贴合MapStruct注解风格的实现(可选)

如果想更符合MapStruct的注解式风格,可通过单独字段映射方法实现:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
import java.util.Arrays;

@Mapper
public interface CarPropertyMapper {
    CarPropertyMapper INSTANCE = Mappers.getMapper(CarPropertyMapper.class);

    @Mapping(source = "type", target = "propertyVal")
    Property typeToProperty(String type);

    @Mapping(source = "model", target = "propertyVal")
    Property modelToProperty(String model);

    @Mapping(source = "color", target = "propertyVal")
    Property colorToProperty(String color);

    default List<Property> carToPropertyList(Car car) {
        return Arrays.asList(
            setPropertyName(typeToProperty(car.getType()), "type"),
            setPropertyName(modelToProperty(car.getModel()), "modelValue"),
            setPropertyName(colorToProperty(car.getColor()), "colorType")
        );
    }

    default Property setPropertyName(Property property, String name) {
        property.setPropertyName(name);
        return property;
    }
}

新增字段时,只需添加对应的XxxToProperty映射方法和一行调用即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:43:16