带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(6)

简介: 带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(6)

带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(5)https://developer.aliyun.com/article/1339759?groupCode=taobaotech


image.png为转换加缓存

在上述的两个方法(extractAgeextractUserNick)中,进行了重复String#split()操作,如果该操作更加复杂

(如从JSON串中提取内容),则会造成资源的浪费。

 

为此,可以给当前的converter加一个缓存字段extraFieldBufferLocal,如下例所示。在例子中,每次解析extra字    段前,先判断buffer是否存在,如果存在则使用缓存内容。

 

注:Mapstruct中使用xxx.INSTANT获得的转换器是单例的,因此,如果要在多线程环境中转换时加入缓存,其缓  存必须声明为ThreadLocal类型。

 

@Mapper
public abstract class Converter {
public static Converter INSTANT = Mappers.getMapper(Converter.class);
  /**
  * extra字段解析后的buffer,避免多次重复解析7 */
  private final ThreadLocal<String[]> extraFieldBufferLocal = new ThreadLocal<>(); 9
@Mapping(target = "age", source = "extra", qualifiedByName = "extractAge")
@Mapping(target = "userNick", source = "extra", qualifiedByName = "extractUserNick")
public abstract VO convertToVO(DTO dto); 13
@Named("extractAge")
public Long extractAge(String extra) {
if (extraFieldBufferLocal.get() == null) {
extraFieldBufferLocal.set(extractExtraField(extra)); 
}
    return Long.valueOf(extraFieldBufferLocal.get()[0]); 
    }
@Named("extractUserNick")
public String extractUserNick(String extra) {
if (extraFieldBufferLocal.get() == null) {
extraFieldBufferLocal.set(extractExtraField(extra)); 
}
28
29    return extraFieldBufferLocal.get()[1]; 
}
  /**
  * 提取extra字段
  *
* @param extra extra字段
* @return extra字段的提取结果
*/
public String[] extractExtraField(final String extra) {
return extra.split(",");
  }
  }

 

 

子类字段互转

 

常用于平铺类和嵌套类之间的转换,例如,前端需要将类中的所有字段打平,就可以参考以下示例代码。

 

image.png互相转换的类

@Data
@Builder
public class VO {
private Long id;
private Date gmtCreate;
private Long age;
private String userNick;
  }

VO:


DTO:

 

@Data
public class DTO { private Long id;
private Date gmtCreate;
private Config config;
@Data
public static class Config{ private String age; private String userNick;
}
}

 

在DTO中,VO的age和userNick字段被放到了子类Config中。此时也可以使用上一节展示的自定义转换函数法进   行转换,不过MapStruct提供了一种更加直观简单的转换方法:

 

带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(7)https://developer.aliyun.com/article/1339757?groupCode=taobaotech

相关文章
|
人工智能 机器人 Serverless
魔搭大模型一键部署到阿里云函数计算,GPU 闲置计费功能可大幅降低开销
魔搭大模型一键部署到阿里云函数计算,GPU 闲置计费功能可大幅降低开销
1135 2
|
存储 Kubernetes API
Kubernetes 的 secret 并不是真正的 secret(上)
Kubernetes 的 secret 并不是真正的 secret
303 0
|
存储 NoSQL Java
工作 6 年,@Transactional 注解用的一塌糊涂
工作 6 年,@Transactional 注解用的一塌糊涂
346 122
|
10月前
|
缓存 网络协议
Jmeter如何对UDP协议进行测试?
`jmeter-plugins`是JMeter的插件管理器,用于管理和组织所有插件。访问[官网](https://jmeter-plugins.org/install/Install/)下载并放置于`lib/ext`目录下,重启JMeter后可在“选项”中看到插件管理器。
364 1
Jmeter如何对UDP协议进行测试?
|
缓存 JavaScript 前端开发
|
Java Android开发 UED
安卓scheme_url调端:如果手机上多个app都注册了 http或者https 的 intent。 调端的时候,调起哪个app呢?
当多个Android应用注册了相同的URL Scheme(如http或https)时,系统会在尝试打开这类链接时展示一个选择对话框,让用户挑选偏好应用。若用户选择“始终”使用某个应用,则后续相同链接将直接由该应用处理,无需再次选择。本文以App A与App B为例,展示了如何在`AndroidManifest.xml`中配置对http与https的支持,并提供了从其他应用发起调用的示例代码。此外,还讨论了如何在系统设置中管理这些默认应用选择,以及建议开发者为避免冲突应注册更独特的Scheme。
|
存储 监控 安全
安全规范问题之跟数据库交互涉及的敏感数据操作需要有哪些措施
安全规范问题之跟数据库交互涉及的敏感数据操作需要有哪些措施
字体样式属性
字体样式属性。
324 0
|
传感器 存储 安全
【物联网】Arduino 实验合集
【物联网】Arduino 实验合集
686 2
|
JSON 前端开发 数据格式
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(4)
带你读《2022技术人的百宝黑皮书》——MapStruct,降低无用代码的神器(4)
218 0