• [MapStruct]枚举的映射


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

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

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

    先上代码,然后讲解

    1. public enum EnumA {
    2. FOOTBALL,BASKETBALL;
    3. }
    4. public enum EnumB {
    5. FOOTBALL,BASKETBALL;
    6. }
    7. @Mapper
    8. public interface EnumMapper {
    9. EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    10. EnumB change(EnumA enumA);
    11. }
    12. public class Test {
    13. public static void main(String[] args) {
    14. EnumA enu = EnumA.BASKETBALL;
    15. EnumB enub = EnumB.FOOTBALL;//作用是为了证明最后通过mapper把EnumA的值传给了他
    16. enub = EnumMapper.INSTANCE.change(enu);
    17. System.out.println(enub); //BASKETBALL
    18. }
    19. }

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

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

    1. public enum EnumA {
    2. FOOTBALL,BASKETBALL;
    3. }
    4. public enum EnumB {
    5. FOOTBALL1,BASKETBALL
    6. }
    7. @Mapper
    8. public interface EnumMapper {
    9. EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    10. @ValueMappings({
    11. @ValueMapping( source = "FOOTBALL" , target = "FOOTBALL1")
    12. })
    13. EnumB change(EnumA enumA);
    14. }
    15. public class Test {
    16. public static void main(String[] args) {
    17. EnumB enub = EnumMapper.INSTANCE.change( EnumA.FOOTBALL);
    18. System.out.println(enub); // FOOTBALL1
    19. }
    20. }

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

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

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

    1. public enum EnumA {
    2. FOOTBALL,BASKETBALL;
    3. }
    4. @Mapper
    5. public interface EnumMapper {
    6. EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    7. String change(EnumA enumA);
    8. }
    9. public class Test {
    10. public static void main(String[] args) {
    11. String str = EnumMapper.INSTANCE.change( EnumA.FOOTBALL);
    12. System.out.println(str); // FOOTBALL
    13. }
    14. }

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

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

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

    1. public enum EnumA {
    2. FOOT,BASKET;
    3. }
    4. public enum EnumB {
    5. FOOT_BALL,BASKET_BALL
    6. }
    7. @Mapper
    8. public interface EnumMapper {
    9. EnumMapper INSTANCE = Mappers.getMapper(EnumMapper.class );
    10. @EnumMapping(nameTransformationStrategy = "suffix", configuration = "_BALL")
    11. EnumB change(EnumA enumA);
    12. }
    13. public class Test {
    14. public static void main(String[] args) {
    15. EnumB enumB = EnumMapper.INSTANCE.change( EnumA.FOOT);
    16. System.out.println(enumB); // FOOT_BALL
    17. }
    18. }

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

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

     

  • 相关阅读:
    LoRaWAN 网络(网关和终端设备)的模拟实现--附源码
    从零开始实现大语言模型(五):缩放点积注意力机制
    MySQL实现的一点总结(一)
    2023年华数杯数学建模C题母亲身心健康对婴儿成长的影响解题全过程文档及程序
    【web-攻击验证机制】(3.4.1)保障验证机制的安全:使用可靠的证书、安全处理证书、正确确认证书、防止信息泄露
    《征服数据结构》字典树(Trie树)
    SkeyeVSS输煤智能视频识别安全监控解决方案
    深度相机辅助导航避障(三):地面点云滤除
    C/C++总结笔记—— 关键字2:const关键字以及指针常量,常量指针,指向常量的常量指针
    在Mac上使用安卓桌面模式
  • 原文地址:https://blog.csdn.net/liuhaibo_ljf/article/details/126524584