Kotlin学习笔记(十)解构声明
2017-06-15 16:08
465 查看
Kotlin中,我们可以将一个对象解构成多个变量:
这就是解构声明。解构声明可以一次声明多个变量,任何表达式都可以出现在解构声明的右侧,只要我们可以对它调用所需数量的component函数(注意:componentN()函数需要用operator关键字修饰,以允许其在解构声明声明中使用它们)。数据类自动声明component函数。
以上代码相当于:
通过解构赋值我们可以在一个函数中返回多个值,例如我们要返回一个name值,一个sex值和一个age值。我们可以这样实现:首先我们根据要返回的值创建一个数据类,然后在函数中返回这个数据类,这样间接我们就返回了多个数值:
我们也可以在for循环中使用解构声明,只要集合中的每个元素提供有componentN()方法
我们也可以对映射使用解构赋值。因为map结构提供函数 component1() 和 component2() 来将每个元素呈现为一对。
在解构声明中你如果不需要某个变量,那么可以用下划线取代其名称:
可以在lambda表达式中使用解构声明。如果 lambda 表达式具有 Pair 类型(或者 Map.Entry 或任何其他具有相应 componentN 函数的类型)的参数,可以通过将它们放在括号中来引入多个新参数来取代单个新参数:
//数据类 data class Person(val name:String="Kotlin",val sex:String="男",val age:Int=1) fun foo(){ var (name,sex,age)=Person()//解构声明 print("name=$name&sex=$sex&age=$age") }
这就是解构声明。解构声明可以一次声明多个变量,任何表达式都可以出现在解构声明的右侧,只要我们可以对它调用所需数量的component函数(注意:componentN()函数需要用operator关键字修饰,以允许其在解构声明声明中使用它们)。数据类自动声明component函数。
以上代码相当于:
//数据类 data class Person(val name:String="Kotlin",val sex:String="男",val age:Int=1) fun foo(){ //var (name,sex,age)=Person() var person=Person() var name=person.component1()//按照声明顺序返回person的第一个属性值,即name属性值 var sex=person.component2()//按照声明顺序返回person的第二个属性值,即sex属性值 var age=person.component3()//按照声明顺序返回person的第三个属性值,即age属性值 print("name=$name&sex=$sex&age=$age") }
通过解构赋值我们可以在一个函数中返回多个值,例如我们要返回一个name值,一个sex值和一个age值。我们可以这样实现:首先我们根据要返回的值创建一个数据类,然后在函数中返回这个数据类,这样间接我们就返回了多个数值:
//数据类 data class Person(val name:String="Kotlin",val sex:String="男",val age:Int=1) fun foo3():Person{ //do something return Person()//返回一个数据类对象 } fun printFoo3(){ var(name,sex,age)= foo3()//解构声明赋值 }
我们也可以在for循环中使用解构声明,只要集合中的每个元素提供有componentN()方法
var collections= arrayListOf<Person>()//list集合中元素要为其每个成员属性提供有componentN方法 for((name,sex,age) in collections){ println("name=$name&sex=$sex&age=$age") }
我们也可以对映射使用解构赋值。因为map结构提供函数 component1() 和 component2() 来将每个元素呈现为一对。
var map= mutableMapOf<String,String>() map.put("name","Kotlin") map.put("sex","男") map.put("age","13") for ((key,value) in map){ println("$key=$value") }
在解构声明中你如果不需要某个变量,那么可以用下划线取代其名称:
var (_,sex,age)=Person()//不需要使用的变量用下划线代替
可以在lambda表达式中使用解构声明。如果 lambda 表达式具有 Pair 类型(或者 Map.Entry 或任何其他具有相应 componentN 函数的类型)的参数,可以通过将它们放在括号中来引入多个新参数来取代单个新参数:
fun foo(person:Person,body:(person:Person)->Unit){ body(person) } fun printFoo(person:Person){ foo(person){ person->//一个Person对象 print("name="+person.name+"sex="+person.sex+"age="+person.age) } //等价于 foo(person){ (name,sex,age)->//一个解构对 print("name="+name+"sex="+sex+"age="+age) } }
相关文章推荐
- Kotlin学习笔记5-1 其他-解构声明
- Kotlin学习(十五): 解构声明(Destructuring Declarations)
- 学习kotlin第13天_具体化的类型参数、内联属性、解构声明、集合
- es6 学习笔记 之 变量声明 和 变量的 解构赋值
- php学习笔记 类的声明与对象实例化
- C专家编程学习笔记——第三章(三):有效地解读C语言的声明
- Inside the C++ Object Model 学习笔记 第五章构造 解构 拷贝语意学
- STL学习笔记 ---- 由set的声明所引发的自定义比较的实现方式
- StringTemplate.Net 学习笔记(5):条件声明
- abap 学习笔记(2) 数据类型声明
- php学习笔记 类的声明与对象实例化
- C++ Primer学习笔记 之 变量的声明与定义
- 成员函数声明为常量的解释--C++学习笔记
- StringTemplate.Net 学习笔记(5):条件声明
- Effective C++学习笔记:初始化列表中成员列出的顺序和它们在类中声明的顺序相同
- php学习笔记之 函数声明(二)
- EffectiveC++第四章类和函数:设计与声明学习笔记
- Objective-C 学习笔记(二) 类声明,定义,实例,初始化
- Objective-C 学习笔记(二) 类声明,定义,实例,初始化
- php学习笔记------[类的声明与对象实例化]