如何使用MapStruct将两个对象映射为一个不可变对象?
可以用MapStruct实现该需求
完全可以通过MapStruct实现你想要的「优先取A对象的字段值,若A的字段为null则 fallback 到B对象对应字段」的映射逻辑,具体实现方式如下:
先明确你的实体类和目标类结构:
类A
class A { private final Obj x; private final AnotherObj y; public A(int x, String y) { // 构造方法实现 } // Getter方法 public Obj getX() { return x; } public AnotherObj getY() { return y; } }
类B
class B { private final Obj x; private final AnotherObj y; // 其他自定义字段 // 构造方法实现 // Getter方法 public Obj getX() { return x; } public AnotherObj getY() { return y; } }
类C
class C { private final Obj x; private final AnotherObj y; public C(Obj x, AnotherObj y) { // 构造方法实现 } // 按需添加Getter方法 }
接下来修改你的CMapper接口,通过@Mapping注解的expression属性指定每个字段的映射逻辑:
@Mapper public interface CMapper { CMapper INSTANCE = Mappers.getMapper(CMapper.class); @Mapping(target = "x", expression = "java(a.getX() != null ? a.getX() : b.getX())") @Mapping(target = "y", expression = "java(a.getY() != null ? a.getY() : b.getY())") C map(A a, B b); }
MapStruct在生成实现类时,会严格按照你在expression中定义的三元逻辑生成代码,最终效果和你手动编写的map方法完全一致。如果后续需要扩展更多字段,只需给每个字段添加对应的@Mapping注解即可;要是字段数量较多,也可以抽取通用工具方法,再在expression中调用该方法简化代码。
内容的提问来源于stack exchange,提问作者HeavyLifter
相关产品推荐
相关产品推荐

