一、什么是解构声明

在 Koltin 中可以把一个对象赋值给多个变量,这种操作叫做解构声明(Destructuring declaration),先看个例子:

data class Book(var name: String, var price: Float)fun main(args: Array<String>) {val (name, price) = Book("Kotlin入门", 66.6f)println(name)println(price)
}
// 输出
Kotlin入门
66.6

我们定义了一个简单的数据类,name、price变量分别输出了对应的属性值,大大简化了我们的操作,神奇吧!

数据类之所以可以使用解构声明,是由于数据类比较特殊,编译器默认为它声明了类似的函数:

operator fun component1(): String {return name}operator fun component2(): Float {return price}

为 name、price变量赋值相当于分别调用了 Book 对象的component1()component2()函数,这也是解构的核心原理。

二、类的自定义解构声明

对于一个普通的类自然不具备解构声明的功能,但我们可以手动声明类似operator fun component1()的方法,来实现解构的功能,例如我们去掉 Book 类的data修饰符,这样Book就是一个普通的类了,然后声明component1()component2()方法,注意需要operator修饰符:

class Book(var name: String, var price: Float) {operator fun component1(): String {return name}operator fun component2(): Float {return price}
}fun main(args: Array<String>) {val (name, price) = Book("Kotlin入门", 66.6f)println(name)println(price)
}

这样就为一个普通类实现了解构声明的功能。

类似的,如果需要一个函数可以返回多个值,也可以考虑使用解构声明:

data class Book(var name: String, var price: Float)fun getBookInfo(): Book {return Book("Kotlin入门", 66.6f)
}fun main(args: Array<String>) {val (name, price) = getBookInfo()
}

了解了这个原理,要让一个类可以实现解构声明的功能也就很简单了。

三、数组、集合的解构声明

Kotlin 中数组,list、map系列集合默认也支持解构声明的功能,例如:

fun main(args: Array<String>) {val array = arrayOf(1, 2, 3)val (a1, a2, a3) = arrayval list = listOf(1, 2, 3)val (b1, b2, b3) = listval map = mapOf("key1" to 1, "key2" to 2, "key3" to 3)for ((key, value) in map) {println("$key-$value")}
}

四、忽略不需要的解构

如果在解构声明中不需要某个变量,那么可以用下划线_取代其名称,这样也就不会调用相应的componentN()操作符函数:

val (_, price) = Book("Kotlin入门", 66.6f)

五、 Lambda 表达式中的解构声明

同样的我们可以对 Lambda 表达式中的参数进行解构声明,当然这个参数要具备可以解构的条件,这部分内容在Kotlin 高阶函数与 Lambda 表达式中已经提到过了,当时如果不了解解构声明的话可能不太好理解,这里再举个例子加深下印象:

data class Book(var name: String, var price: Float)fun showBookInfo(book: Book, block: (Book) -> Unit) {book.run(block)
}fun main(args: Array<String>) {val book = Book("Kotlin入门", 66.6f)showBookInfo(book) { (name, price) ->println("书名:$name")println("价格:$price")}
}

即我们将默认的Book类型的it参数解构成了(name, price)

Kotlin 解构声明相关推荐

  1. kotlin学习之解构声明(十二)

    目录 1. 解构声明的概念 2. 创建变量 3. 循环 4. 函数 5. Map 1. 解构声明的概念 把一个对象成员解构成多个变量,成为解构函数,component1(),component2()等 ...

  2. Kotlin学习笔记 第四章 解构声明 集合集合的扩展方法 Range 异常 Throw关键字

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  3. Kotlin基础学习(十九)—— 解构声明和组件函数

    解构声明的作用:展开单个复合值. 一个解构声明看起来像一个普通的变量声明,但它在括号中有多个变量 1.解构声明举例: val p = Point(10,20) //Point 是数据类 val(x, ...

  4. ES6读书笔记--一入解构深似海

    解构为何有用? 在 ES5 及更早版本中,从对象或数组中获取信息.并将特定数据存入本地变量,需要书写许 多并且相似的代码.例如: let options = {repeat: true,save: f ...

  5. [JavaScript]解构赋值详解

    文章目录 概念 数组解构 声明分别赋值 解构默认值 交换变量值 解构函数返回的数组 忽略返回值(或跳过某一项) 赋值数组剩余值给一个变量 嵌套数组解构 字符串解构 对象解构 基础对象解构 赋值给新变量 ...

  6. 疯狂Kotlin讲义学习笔记07章:面向对象(上)对象,中缀,解构,幕后字段、属性,延迟初始化,访问控制符,构造器,继承,重写,super限定,重写,多态,is类型检查,as强制类型转换

    1.定义类的标准格式 修饰符 class 类名 [ constructor 主构造器]{零到多个次构造器定义零到多个属性....零到多个方法.... } 修饰符open是final的反义词,用于修饰一 ...

  7. ES6/06/ES6简介,ES6新增语法,let声明变量,const声明常量,var,let和const总结,数组解构,对象解构,箭头函数,剩余参数

    ES6简介 ES全称:ECMAScript ; 由ECMA国际化组织制定的标准脚本语言的标准化规范: 为什么使用ES6? 每一次标准的诞生都意味着语言的完善,功能的加强,JavaScript语言本身也 ...

  8. ES6学习笔记二 新的声明方式和变量的解构赋值!

    新的声明方式 在ES5的时候,我们只有一个声明方式,var!但是在es6中,声明进行了扩展,我们加上ES5的var的申明方式,我们有了三种声明方式: var:它是variable的简写,可以理解成变量 ...

  9. TypeScript笔记 5--变量声明(解构和展开)

    解构是什么 解构(destructuring assignment)是一种表达式,将数组或者对象中的数据赋给另一变量. 在开发过程中,我们经常遇到这样问题,需要将对象某个属性的值赋给其它两个变量.代码 ...

最新文章

  1. 利用IIS作为宿主 发布你的WCF Service(转)
  2. 这就是芬兰:先让全国1%的人学起AI!
  3. CodeForces 645B Mischievous Mess Makers
  4. vb.net机器学习-手写和本机数字识别-K均值和欧氏距离
  5. Yii Listview
  6. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
  7. 加强计算机网络应用,如何加强计算机网络管理技术创新应用
  8. Java描述设计模式(12):外观模式
  9. python汉诺塔运行程序_用python编写一个程序,得到汉诺塔的解决方案
  10. 95-10-070-启动-SocketServer启动
  11. 开发ffmpeg/live555常见问题错误及解决方法
  12. 修改marathon源码后,如何编译,部署到集群中?
  13. 解决启动CAD时没有响应
  14. 道法演讲之马云从事教育
  15. 银河麒麟Telnet远程登录
  16. notepad++更换皮肤
  17. 用matlab实现线性系统的频域分析,用matlab实现线性系统的频域分析.doc
  18. [NOI2008]糖果雨
  19. 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
  20. 1546. 和为目标值且不重叠的非空子数组的最大数目-贪心算法

热门文章

  1. linux如何添加旅游,Linux U挂载方法
  2. 【软件测试-6】 测试管理篇
  3. 用计算机如何换成音乐,win10电脑中怎么将视频转换成音频mp3格式
  4. 关于谷歌浏览器屏蔽广告方法(uBlock Origin)
  5. SSD固态盘应用于Ceph集群的四种典型使用场景
  6. PADS转AD的格式以及错误处理
  7. 如何调用cmd.exe程序,并可以传递一些命令行参数
  8. 创建centos7下的加密移动硬盘
  9. c语言中double sper是什么意思啊,C语言 怎么样定义日期
  10. 我做外包的血与泪,也是很多同行的缩影,引以为鉴