带你读《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

相关文章
|
开发工具
推荐几款typora替代品
MarkText Typedown Atom
|
Apache 数据中心 微服务
构建可扩展的消息系统:Apache Pulsar和NATS的比较
消息系统在现代分布式应用程序中扮演着至关重要的角色,它们用于实现异步通信、事件驱动架构和可靠数据传输。在本篇文章中,我们将探讨两个流行的消息系统:Apache Pulsar和NATS,并比较它们的特点、性能和可扩展性。我们将研究它们的架构、部署方式以及如何使用它们来构建可靠和高性能的消息传递系统。
1076 0
|
安全 Java API
Spring Boot 3.x 在 2.x基础上有什么重大的改进?
Spring Boot 3.x于2022年11月发布,带来了诸多重大更新。主要改进包括:最低要求Java 17,整合Jakarta EE 9,优化实例化和配置支持,基于Spring Framework 6.x,引入AOT编译,增强GraalVM原生映像支持,改进日志管理和集成测试,提供更详细的Actuator监控功能,以及对Spring Cloud的兼容性更新。这些变化为现代云原生应用开发提供了更强支持。
2008 36
|
Cloud Native Java 微服务
Spring Boot 3.x 现代化应用开发实战技巧与最佳实践
本指南基于Spring Boot 3.x,融合微服务、云原生与响应式编程等前沿技术,打造现代化应用开发实践。通过构建智能电商平台案例,涵盖商品、订单、用户等核心服务,展示Spring WebFlux、OAuth 2.0认证、Spring Cloud Gateway路由、GraalVM原生编译等技术实现。同时提供Docker/Kubernetes部署方案及性能优化策略,助您掌握从开发到生产的全流程。代码示例详实,适合进阶开发者参考。
1059 2
|
10月前
|
前端开发 NoSQL 关系型数据库
如何开发研发项目管理中的需求管理板块?(附架构图+流程图+代码参考)
本文探讨了中小企业在研发或产品工作中常见的需求管理问题,如需求记录混乱、交付靠口头约定、变更无追踪等。通过系统化的需求管理,可实现“谁在做什么、为什么做、何时完成、谁验收”的可视化与责任归属,减少沟通成本,提升效率。文章详细介绍了需求管理的核心功能模块(如需求看板、处理流程、研发日报)、系统架构设计、前后端实现参考、开发技巧与落地建议,以及上线后的运营指标与实施路线图。最终目标是将松散的流程规范化、可追踪、可复用,助力企业构建高效的研发项目管理体系。
|
Java 网络安全 开发工具
【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息
【Azure 事件中心】Event Hub 无法连接,出现 Did not observe any item or terminal signal within 60000ms in 'flatMapMany' 的错误消息
756 1
|
存储 消息中间件 缓存
独特架构打造新一代消息队列Apache Pulsar
Apache Pulsar 是一个开源的分布式消息流平台,由雅虎开发并于 2016 年开源,2018 年成为 Apache 顶级项目。Pulsar 通过独特的架构提供多租户、持久化存储和批处理等高级功能,支持高吞吐量、低延迟的消息传递。其核心组件包括 Broker、Apache BookKeeper 和 Apache ZooKeeper,分别负责消息处理、持久化存储和集群管理。
749 1
|
缓存 前端开发 Java
在Java项目中实现跨域资源共享(CORS)
在Java项目中实现跨域资源共享(CORS)
|
Java 开发工具 git
java开发配置全局git忽略文件(IDEA)
java开发配置全局git忽略文件(IDEA)
967 0
|
Java Spring
Spring Boot Admin 自定义健康检查
Spring Boot Admin 自定义健康检查
329 0