如何利用MapStruct自动合并同类型对象的所有Map字段?
用MapStruct自动合并对象的所有Map字段
当然可以用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 Mapper接口
创建一个Mapper接口,MapStruct会自动生成实现类,处理所有Map字段的合并:
import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.HashMap; import java.util.Map; @Mapper public interface ObjMapper { // 生成单例实例,供业务代码调用 ObjMapper INSTANCE = Mappers.getMapper(ObjMapper.class); // 核心合并方法,MapStruct会自动映射所有Map字段并调用合并逻辑 Obj merge(Obj ob1, Obj ob2); // 通用Map合并逻辑,MapStruct会对所有Map类型字段自动调用此方法 default <T> Map<String, T> merge(Map<String, T> map1, Map<String, T> map2) { if (map1 == null && map2 == null) { return null; } Map<String, T> mergedMap = new HashMap<>(); if (map1 != null) { mergedMap.putAll(map1); } if (map2 != null) { mergedMap.putAll(map2); } return mergedMap; } }
3. 业务代码中调用合并
直接通过Mapper实例完成合并,无需手动维护每个字段:
Obj ob1 = // 第一个对象 Obj ob2 = // 第二个对象 Obj mergedObj = ObjMapper.INSTANCE.merge(ob1, ob2);
关键注意事项
- Getter方法要求:确保
Obj类拥有所有Map字段的getter方法(自动生成的类通常会默认生成),MapStruct依赖getter获取源对象的字段值。 - 避免修改原对象:上述合并逻辑会创建新的
HashMap存储合并结果,不会修改原对象中的Map,避免副作用。 - 自定义字段逻辑:如果个别字段需要特殊处理(比如不取合并值,而是优先取其中一个对象的字段),可以通过
@Mapping注解单独指定:@Mapping(target = "propC", source = "ob1.propC") Obj merge(Obj ob1, Obj ob2);
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

