[MapStruct]枚举的映射

本篇文章对应的是官网【8. Mapping Values】的相关内容。

首先弄清官网中说的source和target,例如要把实例A的内容给实例B,那么实例A就是source,实例B就是target。source这就咱就称它为源,target成为目标

1.将一个枚举类型的值给另外一个枚举类型

先上代码,然后讲解

public enum EnumA {
    FOOTBALL,BASKETBALL;
}

public enum EnumB {
    FOOTBALL,BASKETBALL;
}

@Mapper
public interface EnumMapper {
    EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    EnumB change(EnumA enumA);
}
public class Test {
    public static void main(String[] args) {
        EnumA enu = EnumA.BASKETBALL;
        EnumB enub = EnumB.FOOTBALL;//作用是为了证明最后通过mapper把EnumA的值传给了他
        enub = EnumMapper.INSTANCE.change(enu);
        System.out.println(enub); //BASKETBALL
    }
}

注意观察代码中2个枚举中的两个属性(在官网中也被成为Constant,无所谓不要太在意)是相同的,官网说过当两个枚举里面的内容相同时,那么Mapper会自动进行映射赋值,也就是change方法就会自动完成这些事情,就是这么简单。

那么如果两个枚举中的内容不相同,怎么办呢?我们就通过@ValueMappings映射一下就行,看下面例子:

public enum EnumA {
    FOOTBALL,BASKETBALL;
}

public enum EnumB {
    FOOTBALL1,BASKETBALL
}

@Mapper
public interface EnumMapper {
    EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    @ValueMappings({
            @ValueMapping( source = "FOOTBALL" , target = "FOOTBALL1")
    })
    EnumB change(EnumA enumA);
}

public class Test {
    public static void main(String[] args) {
        EnumB enub = EnumMapper.INSTANCE.change( EnumA.FOOTBALL);
        System.out.println(enub); // FOOTBALL1
    }
}

可以看到,当两个枚举中内容不同时,要让他们映射起来就要使用@ValueMappings,作用就是当在枚举A中选择了某个值(FOOTBALL),那么转换成枚举B时,就告诉枚举B根据映射关系,此时你的值应该是target指定的FOOTABLL1。这个有可能有点绕,大家在好好理一理。用法其实很简单。

2. 字符串类型和枚举类型之间的映射

这个其实很简单,就是修改Mapper中返回值或者参数的类型就行了。拿枚举到字符串之间的映射来举例:

public enum EnumA {
    FOOTBALL,BASKETBALL;
}

@Mapper
public interface EnumMapper {
    EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    String change(EnumA enumA);
}
public class Test {
    public static void main(String[] args) {
        String str = EnumMapper.INSTANCE.change( EnumA.FOOTBALL);
        System.out.println(str); // FOOTBALL
    }
}

可以看到最后枚举的值被映射到字符串类型的str中了。

3.枚举通过后缀方式映射

上面讲过如果两个枚举中的内容不通,那么需要通过@ValueMappings来指定映射关系,那么如果不使用这个注解,还有什么方式呢?就是这里说的后缀的方式。这种方式的前提是枚举A中的内容加上一个特定后缀后,能够与枚举B中的内容相同才行,看例子:

public enum EnumA {
    FOOT,BASKET;
}
public enum EnumB {
    FOOT_BALL,BASKET_BALL
}
@Mapper
public interface EnumMapper {
    EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    @EnumMapping(nameTransformationStrategy = "suffix", configuration = "_BALL")
    EnumB change(EnumA enumA);
}
public class Test {
    public static void main(String[] args) {
        EnumB enumB = EnumMapper.INSTANCE.change( EnumA.FOOT);
        System.out.println(enumB); // FOOT_BALL
    }
}

看上面代码,注意观察两个枚举,EnumB显然比EnumA多了_BALL这个后缀,那么在Mapper中就可以设置通过后缀模式来映射,这样就将两个枚举映射起来了。在EnumA中设置的FOOT,到了EnumB中就成了FOOT_BALL了。

除了后缀模式,还有前缀模式等多种模式,大家可以看源码和官网。道理相同,这里就不多做说明了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值