原文: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相关推荐

  1. kotlin将对象转换为map_将网站转换为Photoshop文档

    WebToLayers是一款能够帮助大家将网页转换成图像格式的软件,能够Web页面转换成PNG,JPG以及PSD格式的图片.当网页转换为PSD的时候,网页的各个要素都会自动转换为相应的图层,使得大家能 ...

  2. kotlin将对象转换为map_Kotlin程序将哈希映射(HashMap)转换为列表(List)

    Kotlin程序将哈希映射(HashMap)转换为列表(List) 在此程序中,您将学习在Kotlin中将map转换为列表的不同方法. 示例:将map转换为列表 示例import java.util. ...

  3. struts2:JSON在struts中的应用(JSP页面中将对象转换为JSON字符串提交、JSP页面中获取后台Response返回的JSON对象)...

    JSON主要创建如下两种数据对象: 由JSON格式字符串创建,转换成JavaScript的Object对象: 由JSON格式字符串创建,转换成JavaScript的List或数组链表对象. 更多关于J ...

  4. 学习Kotlin(四)对象与泛型

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  5. 《Kotlin 程序设计》第五章 Kotlin 面向对象编程(OOP)

    第五章 Kotlin 面向对象编程(OOP) 正式上架:<Kotlin极简教程>Official on shelves: Kotlin Programming minimalist tut ...

  6. kotlin 复制对象属性_Kotlin 怎么学 ?遇到过哪些坑?

    本文作者 作者:kotlon 链接: https://www.jianshu.com/p/dcf6cd7c59a3 本文由作者授权发布. 1kotlin 优势 kotlin 在 17 年 google ...

  7. 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 ...

  8. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  9. kotlin半生对象_如何在Kotlin中使用Actor实现对象池

    kotlin半生对象 by osha1 由osha1 如何在Kotlin中使用Actor实现对象池 (How to implement an Object-Pool with an Actor in ...

最新文章

  1. 程序员的你还沉浸在大公司就是螺丝钉?小公司锻炼人?错了!看完即懂
  2. IT行业分析之企业信息化技术
  3. c++ 不允许使用不完整的类型_Python入门高级教程--Python?变量类型
  4. nssl1249-C【数论】
  5. python教材答案第六章_python第六章{输入和输出}
  6. python决策树的应用_机器学习-决策树实战应用
  7. LeetCode 69 x 的平方根
  8. soapUI中多个TestCase之间传递参数
  9. tts android,Android系统自带的TTS实现语音播报
  10. Python入门--二重循环中的continue和break
  11. 当线程在捕捉异常,即使马上杀掉线程,捕捉到异常之后仍然执行异常处理程序...
  12. Report Machine 的问题 补充!!!
  13. 大数据Hadoop之——Cloudera Hadoop(CM 6.3.1+CDH 6.3.2环境部署)
  14. mysql修改校对集_关于MySQL字符集和校对集问题
  15. 3ds Max 实验十四 UVW展开
  16. 《结构动力分析的MATLAB实现》,结构动力分析的MATLAB实现
  17. mysql 矩阵运算_HDU 2276 Kiki amp; Little Kiki 2 (位运算+矩阵快速幂)
  18. 计算机组成原理——乘法运算(一位乘)
  19. IT人士必去的10个网站
  20. 计算机无法识别读卡器怎么办,电脑读卡器读不出来怎么办

热门文章

  1. Qt / 如何解决移动了 Qt 的项目,但是 Qt 在原目录下生成编译文件的问题
  2. mysql ef 随机排序_EFCore+Mysql倉儲層建設(分頁、多字段排序、部分字段更新)
  3. python3 解析html_Python3.x网页抓取HTMLParser
  4. IE浏览器error:Promise未定义
  5. idea社区版和企业版区别_IntelliJ IDEA 旗舰版与社区版有什么不同
  6. 苹果手机视频传输教程-通过无线将电脑上视频传到手机
  7. $.extend 的相关用法
  8. 读书笔记---图解HTTP(一)
  9. poj 2778 AC自动机+矩阵快速幂
  10. 单链表之头插法的理解!