如何优化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
相关产品推荐
相关产品推荐

