解构声明(Destructuring Declarations)
解构声明的概念和作用
把一个对象成员解构(destructure)成多个变量,称为解构声明(destructuring declaration)。
component1(),component2()等函数是Kotlin约定的操作符,componentN是操作符(类似加减乘除的运算符),重载操作符必须要用operator修饰以允许使用
class MyPair<K, V>(val first: K, val second: V) {
operator fun component1(): K {
return first;
}
operator fun component2(): V {
return second;
}
}
fun main(args: Array<String>) {
val pair = MyPair(1, "one")
val (num, name) = pair
println("num = $num, name = $name")
}
数据类(data class)
编译器会为数据类(data class)自动声明/定义componentN()函数,可直接使用解构声明。
data class Person (val name: String,val age: Int,val addr:String){
}
fun main(args: Array<String>) {
var person = Person("Jone", 20, "henan")
println("name:${person.component1()},age:${person.component2()},addr:${person.component3()}")
}
函数返回多个变量(Return Values)
如果需要一个函数返回多个变量,Kotlin最简洁的实现是声明一个数据类并返回其实例对象。
data class Result(val result: Int, val message: String)
fun getResult(): Result {
return Result(1, "ok")
}
fun main(args: Array<String>) {
val (result, message) = getResult();
println("result=$result,message=$message")
}
for循环-解构声明
var personA: Person = Person("Door", 22, "ShanDong")
var personB: Person = Person("Green", 30, "BeiJing")
var personC: Person = Person("Dark", 23, "YunNan")
var personD: Person = Person("Tool", 26, "GuanDong")
var personE: Person = Person("Mark", 24, "TianJin")
var pers = listOf(personA, personB, personC, personD, personE)
for ((name, age,addr) in pers) {
println("name:$name,age:$age,addr:$addr")
}
自定义componentN
在Kotlin数据类中,编译器会根据主构造器中声明的全部属性, 自动推断产生componentN() 函数,但是对于普通类的成员属性,编译器并不会自动推断产生componentN() ,此时componentN()需要我们自己定义了。
data class Person (val name: String,val age: Int,val addr:String){
var mobile: String ?= null
operator fun component4(): String {
return this.mobile!!
}
}
fun main(args: Array<String>) {
var person: Person = Person("Jone", 20, "ShangHai")
person.mobile = "147323"
var (name, age, addr, mobile) = person
println("name: $name, age: $age, addr: $addr, mobile: $mobile")
}
对于自定义的componentN(),componentN()函数需要标记为 operator,才可以在解构声明中使用
Map-解构声明
在Kotlin的标准库中,对Map实现了这些扩展函数:
operator fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator() operator fun <K, V> Map.Entry<K, V>.component1() = getKey() operator fun <K, V> Map.Entry<K, V>.component2() = getValue()
也就是意味着:
- 实现 iterator() 函数, 使得 map 成为多个值构成的序列
- 实现 component1() 和 component2() 函数, 使得 map 内的每个元素成为一对值
这样,我们可以对 map 的for循环中自由地使用解构声明,例如:
fun main(args:Array<String>){
val map = hashMapOf<String, Int>()
map.put("one", 1)
map.put("two", 2)
for ((key, value) in map) {
println("key = $key,value = $value")
}
}
如果解构的参数中的一个组件未使用,那么可以将其替换为下划线,以避免编造其名称:
map.mapValues { (_, value) -> println("$value!") }
可以指定整个解构的参数的类型或者分别指定特定组件的类型:
map.mapValues { (_, value:Int) -> println("$value!") }
解构声明(Destructuring Declarations)的更多相关文章
- 解构赋值 Destructuring Assignment
解构赋值 Destructuring Assignment ES6中可以通过一定的模式将数组或对象中的值直接赋值给外部变量,称为解构 对象的解构赋值 // 在ES5中,当需要获取一个对象中的变量值的时 ...
- ES6新特性:利用解构赋值 (destructuring assignment), 简化代码
本文的Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : 解构赋值是一种表达式, 利用这种新语法, 可以直接从数组或者对象中快速提取值 赋值给不 ...
- ECMAScript 6的解构赋值 ( destructuring assignment)
var provinceValues=["010","020","028","0755","023" ...
- ES6--变量的声明及解构赋值
ES6的目标是使得JavaScript语言能够用来编写大型的复杂的应用程序.成为企业级开发语言:该标准已于2015年6月17日正式公布. 可是真正的普及我觉得还得须要一段时间.然而这并非理由让我们 ...
- 变量的解构赋值////////////z
变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...
- Es6 新增解构赋值
1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 要想实现解构,就必须是容器,或者具有可遍历的接口. 以前,为 ...
- es6 解构赋值
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值 ...
- ECMAScript 6入门 - 变量的解构赋值
定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...
- ES6 继续 变量的解构赋值
春节放假这几天,感觉跟梦一样,瞬间就过去了.现在上班的前几天,都感觉有点不真实,不过看到口袋里的钱,就知道,是真真实实的度过了这个假期. 现在得开始重新工作了: 变量的解构赋值 ES6 允许按照一定模 ...
随机推荐
- PS外挂滤镜调出清晰对比照片
最终效果 一.打开原图. 二.我们使用类似第一部分的相同方法,但设置上略有不同,我们将光线放在不同的地方.复制底层,执行滤镜-LUCIS ART水彩滤镜-LUCISART 选择 雕刻 设置参数为25. ...
- mysql 5.7 json
项目中使用的mysql5.6数据库,数据库表一张表中存的字段为blob类型的json串数据.性能压测中涉及该json串处理效率比较低,开发人员提到mysql5.7版本后json串提供了原生态的json ...
- iView组件添加API中介绍的事件的方式(render方式添加事件)
iView组件好用,文档齐全,品质可靠稳定.最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件.给作者点个赞.用这个组件来学习Vue.js也是不错的选择. 最近用的比 ...
- Go语言公开或未公开的标识符
Go语言公开或未公开的标识符的基本概念 Go语言支持从包里公开或者隐藏标志符,通过这个特性,可以让用户按照自己的规则控制标识符的可见性. Go语言中的可见性,是通过声明类型的大小写来进行区别的. 例如 ...
- redis - Sentinel 和 cluster
redis哨兵集群 引入 上回说到redis主从同步时,master(主库)如果宕机了怎么解决... 我给出了一个手动解决的办法! 但实际上,如果你配置了Sentinel,它能自动发现master宕机 ...
- rest framework 分页,版本
分页 分页器的引入 from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorP ...
- Nim积解法小结
由于某毒瘤出题人 redbag 不得不学习一下这个史诗毒瘤算法. 本文参考了 Owaski 的 GameTheory 的课件. 定义 我们对于一些二维 \(\mathrm{Nim}\) 游戏(好像更高 ...
- C++ bitset 常用函数及运算符
C++ bitset--高端压位卡常题必备STL 以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力. bitset存储二进制数位. bitset就像一个bool类型的数组一样,但是有 ...
- 「POJ2891」Strange Way to Express Integers【数学归纳法,扩展中国剩余定理】
题目链接 [VJ传送门] 题目描述 给你\(a_1...a_n\)和\(m_1...m_n\),求一个最小的正整数\(x\),满足\(\forall i\in[1,n] \equiv a_i(mod ...
- Matlab中simulink的state space模块
%列写状态空间表达式矩阵 A=[- -;]; B=[ ; ]; C=[ ; ]; D=[ ; ]; %得到传递函数表达式 [num, den]=ss2tf(A, B, C, D, ); %在命令行打印 ...