kotlin学习之解构声明(十二)
目录
- 1. 解构声明的概念
- 2. 创建变量
- 3. 循环
- 4. 函数
- 5. Map
1. 解构声明的概念
把一个对象成员解构成多个变量,成为解构函数,component1(),component2()等函数是Kotlin约定的操作符。
解构函数可以用于:
- 创建变量
- 循环
- 函数
- map
2. 创建变量
data class Person(val name: String, val age: Int)fun main(args: Array<String>) {val (name, age) = Person("person", 1)println(name) println(age)
}
这样的写法实际上就是避免了以往(对象.属性)调用方式,我们也知道(对象.属性)实际上就是调用了该类的get方法。通过反编译得到的代码为:
public final class HelloKt {public static final void main(@NotNull String[] args) {Person person = new Person("person", true); String str = person.component1(); int age = person.component2();System.out.println(str);System.out.println(age);}
}
3. 循环
data class Person(val name: String, val age: Int)val list: List<Person> = listOf(Person("one", 1), Person("two", 2), Person("three", 3), Person("four", 4))fun main(args: Array<String>) {list.forEach { (name, age) ->println("name:$name, age:$age")}
}
反编译如下:
public final class HelloKt { Iterator iterator = $this$forEach$iv.iterator(); if (iterator.hasNext()) { Object element$iv = iterator.next(); Person $dstr$name$age = (Person)element$iv; String name = $dstr$name$age.component1(); int age = $dstr$name$age.component2();String str = "name:" + name + ", age:" + age;System.out.println(str); }
}
可以看到$dstr$name$age
该变量存储了一个People临时变量,使用方法类似于Lambda表达式。
4. 函数
fun getPair(after: String?, afterAge: Int?): Pair<String, Int> {var name = "yangjin"var age ?: 23return Pair(name, age)
}fun main(args: Array<String>) {val (name, age) = getPair("jowan", null)println("name:$name, age:$age");
}
反编译的代码如下:
public static final Pair<String, Integer> getPair(@Nullable String after, @Nullable Integer afterAge) { String name = "yangjin";int age = 23;name = name;age = (afterAge != null) ? afterAge.intValue() : age;return new Pair(name, Integer.valueOf(age)); }public static final void main(@NotNull String[] args) {Pair pair = getPair("jowan", null); String str1 = (String)pair.component1(); int age = ((Number)pair.component2()).intValue();String str2 = "name:" + str1 + ", age:" + age; boolean bool = false; System.out.println(str2);}
}
可以看到,函数的这种实现方式实际上就是用Pair来实现的。Pair存在两个参数,而且其重写了ComponentN的方法。
5. Map
解构声明还可以Map中,前提条件是:
通过提供一个iterator()函数将每个映射表示为一个值
通过提供函数component1()和component2()来将每个元素呈现为一对
val map: Map<String, Int> = mapOf("one" to 1, "two" to 2, "three" to 3, "four" to 4)fun main(args: Array<String>) {map.forEach { (name, age) ->println("name:$name, age:$age")}
}
反编译的代码如下:
public static final void main(@NotNull String[] args) {Intrinsics.checkParameterIsNotNull(args, "args"); Map $this$forEach$iv = map; Map map1 = $this$forEach$iv; Iterator iterator = map1.entrySet().iterator(); if (iterator.hasNext()) { Map.Entry element$iv = (Map.Entry)iterator.next(), $dstr$name$age = element$iv; Map.Entry entry = $dstr$name$age; String name = (String)entry.getKey(); int age = ((Number)entry.getValue()).intValue();String str = "name:" + name + ", age:" + age;System.out.println(str); }
}
kotlin学习之解构声明(十二)相关推荐
- Kotlin基础学习(十九)—— 解构声明和组件函数
解构声明的作用:展开单个复合值. 一个解构声明看起来像一个普通的变量声明,但它在括号中有多个变量 1.解构声明举例: val p = Point(10,20) //Point 是数据类 val(x, ...
- Kotlin学习笔记 第四章 解构声明 集合集合的扩展方法 Range 异常 Throw关键字
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin 解构声明
一.什么是解构声明 在 Koltin 中可以把一个对象赋值给多个变量,这种操作叫做解构声明(Destructuring declaration),先看个例子: data class Book(var ...
- Tensorflow 2.x(keras)源码详解之第十二章:keras中的损失函数之BinaryCrossentropy详解
大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...
- 零基础带你学习MySQL—分组统计(十二)
零基础带你学习MySQL-分组统计(十二) 如何理解分组 ? 课后练习题
- # java学习笔记 2020 2/8(十二)慕课网 构造方法
java学习笔记 2020 2/8(十二)慕课网 构造方法 构造方法是一种特殊的方法,它是一个与类同名的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会 ...
- 解构微信(二):团队是研究院、艺术中心甚至学校
搜狐IT 2013-11-19 11:47 13 微信 [声明]本案例是由郑小平和许家馨在杨斌教授的指导下编写的,仅用于课堂讨论.本案例中的情况描述不反映编者的观点,也不作为正式文件.基本数据来源以及 ...
- 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)
大家好,我是老三,开工大吉,虎年第一篇,面渣逆袭系列继续! 这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 建议大家收藏了慢慢看,新的一年一定能够跳槽加薪,虎年& ...
- 深入理解机器学习:从理论到算法-习题全解之第十二章:凸学习问题
最新文章
- 1月24日学习内容整理:Django的admin组件源码分析及流程
- Python实现视频语音和字幕自动审查功能
- 将jQuery的复选框设置为“已选中”?
- zookeeper OOM问题排查
- [luoguP1352] 没有上司的舞会(DP)
- 2022爱分析・汽车行业数字化实践报告
- 从烂漫少女到已为人母:八年青春 梦断互联网
- pxe+kickstart实现企业的无人值守系统
- Excel中VLOOKUP函数简易使用——精确匹配或近似匹配数据
- 使用mdadm创建raid mdadm命令详解
- 第二章计算机网络答案,计算机网络第二章作业参考答案
- linux 硬连接和软连接
- 【20】WAV格式歌曲
- Spring Integration学习笔记:简介
- 【清单】搜索引擎使用大法
- 谁才是真正五道杠?空气净化器滤网分析
- b85主板装服务器系统,华硕b85主板装不上Win7怎么办?华硕b85主板装不上Win7解决方法...
- win7打开远程计算机,win7系统开启远程桌面实现远程连接图文教程
- java.nio.charset.MalformedInputException: Input length = 2
- Pbd反编译(PBD文件变为PBL)(pbdviewer)特性