一、什么是解构声明

在 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. (一)Cisco DHCP Snooping原理(转载)
  2. 手把手教你DIY最便宜的 arduino 温湿度计,详细图文视频教程
  3. Python第十课 网络管理
  4. 前端学习(2875):原生js模块化+入口模块和子类的编写
  5. Android 系统(260)---Android 读取SIM卡参数
  6. SQL63 刷题通过的题目排名
  7. 表格标签(HTML)
  8. 钉钉主要是用来打卡的,为什么打卡不能放在首页?
  9. php跳转图片_HTML点击图片跳转到新页面怎么实现?(示例)
  10. PASCAL VOC2012数据集内容解读
  11. 今日头条校招真题——异或
  12. 学习=拟合?深度学习和经典统计学是一回事吗?
  13. Flex入门基础——项目item的属性(order、flex-grow、flex-shrink、flex-basis、flex、align-self)
  14. linux系统硬盘设置密码,linux下硬盘加密
  15. java是什么?用来做什么的?
  16. 大前端relative和absolute详解
  17. js 前端 时间戳转字符串 2019-08-18T16:00:00.000Z 转换 2019-08-19 00:00:00
  18. xilinx 账户申请以及vivado 安装
  19. 关于 英文的 金额转换
  20. 【Linux】ln: failed to create symbolic link ‘*.so’: Operation not supported

热门文章

  1. 三轴转孔程序 采用信捷XD5和信捷触摸屏编写。
  2. 一个完整计算机软件应包含,一个完整的计算机软件应包含
  3. TSN(时间敏感网络)测试、仿真、分析平台应用攻略
  4. 赞丽生活、趣步的区块链电商模式解析
  5. xmind思维导图怎么把字体变大_思维导图软件xmind如何调整主题之间的间距
  6. 如何修改或删除账目,打印账目表格
  7. 中国哪所大学的理论计算机水平高,在计算机领域,中国哪所大学最牛?
  8. “智慧校园”到底怎么做,才能俘获高校的“芳心”
  9. 5g智慧灯杆网关充电桩系统的应用案例
  10. ug4.0找不到服务器怎么办,ug 4.0 许可证服务器尚未启动 或者ugll许可文件被设置为错误的端口什么意思...