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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:36:15