kotlin将对象转换为map_在 Kotlin 的 data class 中使用 MapStruct
原文:https://zhuanlan.zhihu.com/p/208525542
一. data class 的 copy() 为浅拷贝
浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
data class 的 copy() 是复制函数,能够复制一个对象的全部属性,也能复制部分的属性。
例如下面的代码:
image.png
执行结果:
image.png
user1.address===user2.address 打印的结果是 true 表示二者内存地址相同。 如果对象内部有引用类型的变量,通过拷贝后二者指向的是同一地址,表示为浅拷贝。所以 data class 的 copy 为浅拷贝。
本文接下来要介绍的不是深拷贝,但跟深拷贝会有一些关系,是 Java Bean 到 Java Bean 的之间的映射。这样类似的工具有:Apache 的 BeanUtils、Dozer、MapStruct 等等。
二. MapStruct 简介
MapStruct 是一个基于JSR269的 Java 注释处理器。开发者只需要定义一个 Mapper 接口,该接口声明任何所需的映射方法。在编译期间 MapStruct 将生成此接口的实现类。
使用 MapStruct 可以在两个 Java Bean 之间实现自动映射的功能,只需要创建好接口。由于它是在编译时自动创建具体的实现,因此无需反射等开销,在性能上也会好于 Apache 的 BeanUtils、Dozer 等。
三. Kotlin 中使用 MapStruct
在 github 上找到了一个 MapStruct Kotlin 实现的开源项目:https://github.com/Pozo/mapstruct-kotlin
3.1 mapstruct-kotlin 的安装:
添加 kapt 插件
image.png
然后在项目中添加如下依赖:
image.png
另外,还需要添加如下依赖:
image.png
3.2 mapstruct-kotlin 的基本使用
对于需要使用 MapStruct 的 data class,必须加上一个@KotlinBuilder注解
image.png
通过添加@KotlinBuilder注解会在编译时生成 UserBuilder、UserDtoBuilder 对象,他们在 Mapper 的实现类中被使用,用于创建对象以及对对象的赋值。
再定义一个 Mapper:
image.png
这样,就可以使用了。MapStruct 会在编译时自动生成好 UserMapperImpl 类,完成将 User 对象转换成 UserDto 对象。
image.png
执行结果:
image.png
3.3 mapstruct-kotlin 的复杂应用
对于稍微复杂的类:
image.png
Person 类中还包含有 Role 类,以及 Person 跟 PersonDto 的属性并不完全一致的情况。在 Mapper 接口中,支持使用@Mappings来做映射。
image.png
在 PersonMapper 的 toDto() 中,对于 PersonDto 没有的属性,在 Mapping 时可以使用ignore = true。
下面来看看,将 person 映射成 personDto,以及 personDto 再映射回 person。
image.png
执行结果:
image.png
由于 Person 没有 phone 这个属性并且在 Mapping 时忽略了,因此转换成 PersonDto 后personDto.phone=null。
而 PersonDto 虽然有 age 属性,但是在 Mapping 时忽略了,因此转换成 Person 后personFromDto.age=0。
这样的结果达到了我们的预期。
总结
在使用 Kotlin 的 data class 时,如果需要做 Java Bean 之间的映射,使用 MapStruct 是一个很不错的选择。
更多深入的java知识点可以来我的java学习群:1080621881 。
kotlin将对象转换为map_在 Kotlin 的 data class 中使用 MapStruct相关推荐
- kotlin将对象转换为map_将网站转换为Photoshop文档
WebToLayers是一款能够帮助大家将网页转换成图像格式的软件,能够Web页面转换成PNG,JPG以及PSD格式的图片.当网页转换为PSD的时候,网页的各个要素都会自动转换为相应的图层,使得大家能 ...
- kotlin将对象转换为map_Kotlin程序将哈希映射(HashMap)转换为列表(List)
Kotlin程序将哈希映射(HashMap)转换为列表(List) 在此程序中,您将学习在Kotlin中将map转换为列表的不同方法. 示例:将map转换为列表 示例import java.util. ...
- struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)...
JSON主要创建如下两种数据对象: 由JSON格式字符串创建,转换成JavaScript的Object对象: 由JSON格式字符串创建,转换成JavaScript的List或数组链表对象. 更多关于J ...
- 学习Kotlin(四)对象与泛型
推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...
- 《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)
第五章 Kotlin 面向对象编程(OOP) 正式上架:<Kotlin极简教程>Official on shelves: Kotlin Programming minimalist tut ...
- kotlin 复制对象属性_Kotlin 怎么学 ?遇到过哪些坑?
本文作者 作者:kotlon 链接: https://www.jianshu.com/p/dcf6cd7c59a3 本文由作者授权发布. 1kotlin 优势 kotlin 在 17 年 google ...
- kotlin 构建对象_使用Kotlin,TypeScript和Okta构建安全的Notes应用程序
kotlin 构建对象 I love my job as a developer advocate at Okta. I get to learn a lot, write interesting b ...
- Kotlin 学习笔记(八)—— Kotlin类与对象之接口
Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...
- kotlin半生对象_如何在Kotlin中使用Actor实现对象池
kotlin半生对象 by osha1 由osha1 如何在Kotlin中使用Actor实现对象池 (How to implement an Object-Pool with an Actor in ...
最新文章
- 程序员的你还沉浸在大公司就是螺丝钉?小公司锻炼人?错了!看完即懂
- IT行业分析之企业信息化技术
- c++ 不允许使用不完整的类型_Python入门高级教程--Python?变量类型
- nssl1249-C【数论】
- python教材答案第六章_python第六章{输入和输出}
- python决策树的应用_机器学习-决策树实战应用
- LeetCode 69 x 的平方根
- soapUI中多个TestCase之间传递参数
- tts android,Android系统自带的TTS实现语音播报
- Python入门--二重循环中的continue和break
- 当线程在捕捉异常,即使马上杀掉线程,捕捉到异常之后仍然执行异常处理程序...
- Report Machine 的问题 补充!!!
- 大数据Hadoop之——Cloudera Hadoop(CM 6.3.1+CDH 6.3.2环境部署)
- mysql修改校对集_关于MySQL字符集和校对集问题
- 3ds Max 实验十四 UVW展开
- 《结构动力分析的MATLAB实现》,结构动力分析的MATLAB实现
- mysql 矩阵运算_HDU 2276 Kiki amp; Little Kiki 2 (位运算+矩阵快速幂)
- 计算机组成原理——乘法运算(一位乘)
- IT人士必去的10个网站
- 计算机无法识别读卡器怎么办,电脑读卡器读不出来怎么办
热门文章
- Qt / 如何解决移动了 Qt 的项目,但是 Qt 在原目录下生成编译文件的问题
- mysql ef 随机排序_EFCore+Mysql倉儲層建設(分頁、多字段排序、部分字段更新)
- python3 解析html_Python3.x网页抓取HTMLParser
- IE浏览器error:Promise未定义
- idea社区版和企业版区别_IntelliJ IDEA 旗舰版与社区版有什么不同
- 苹果手机视频传输教程-通过无线将电脑上视频传到手机
- $.extend 的相关用法
- 读书笔记---图解HTTP(一)
- poj 2778 AC自动机+矩阵快速幂
- 单链表之头插法的理解!