目录

  • 1. 解构声明的概念
  • 2. 创建变量
  • 3. 循环
  • 4. 函数
  • 5. Map

1. 解构声明的概念

把一个对象成员解构成多个变量,成为解构函数,component1(),component2()等函数是Kotlin约定的操作符。

解构函数可以用于:

  1. 创建变量
  2. 循环
  3. 函数
  4. 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学习之解构声明(十二)相关推荐

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

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

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

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

  3. Kotlin 解构声明

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

  4. Tensorflow 2.x(keras)源码详解之第十二章:keras中的损失函数之BinaryCrossentropy详解

      大家好,我是爱编程的喵喵.双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中.从事机器学习以及相关的前后端开发工作.曾在阿里云.科大讯飞.CCF等比赛获得多次Top名次.现 ...

  5. 零基础带你学习MySQL—分组统计(十二)

    零基础带你学习MySQL-分组统计(十二) 如何理解分组 ? 课后练习题

  6. # java学习笔记 2020 2/8(十二)慕课网 构造方法

    java学习笔记 2020 2/8(十二)慕课网 构造方法 构造方法是一种特殊的方法,它是一个与类同名的方法. 对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化. 当类实例化一个对象时会 ...

  7. 解构微信(二):团队是研究院、艺术中心甚至学校

    搜狐IT 2013-11-19 11:47 13 微信 [声明]本案例是由郑小平和许家馨在杨斌教授的指导下编写的,仅用于课堂讨论.本案例中的情况描述不反映编者的观点,也不作为正式文件.基本数据来源以及 ...

  8. 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)

    大家好,我是老三,开工大吉,虎年第一篇,面渣逆袭系列继续! 这次给大家带来了计算机网络六十二问,三万字,七十图详解,大概是全网最全的网络面试题. 建议大家收藏了慢慢看,新的一年一定能够跳槽加薪,虎年& ...

  9. 深入理解机器学习:从理论到算法-习题全解之第十二章:凸学习问题

最新文章

  1. 1月24日学习内容整理:Django的admin组件源码分析及流程
  2. Python实现视频语音和字幕自动审查功能
  3. 将jQuery的复选框设置为“已选中”?
  4. zookeeper OOM问题排查
  5. [luoguP1352] 没有上司的舞会(DP)
  6. 2022爱分析・汽车行业数字化实践报告
  7. 从烂漫少女到已为人母:八年青春 梦断互联网
  8. pxe+kickstart实现企业的无人值守系统
  9. Excel中VLOOKUP函数简易使用——精确匹配或近似匹配数据
  10. 使用mdadm创建raid mdadm命令详解
  11. 第二章计算机网络答案,计算机网络第二章作业参考答案
  12. linux 硬连接和软连接
  13. 【20】WAV格式歌曲
  14. Spring Integration学习笔记:简介
  15. 【清单】搜索引擎使用大法
  16. 谁才是真正五道杠?空气净化器滤网分析
  17. b85主板装服务器系统,华硕b85主板装不上Win7怎么办?华硕b85主板装不上Win7解决方法...
  18. win7打开远程计算机,win7系统开启远程桌面实现远程连接图文教程
  19. java.nio.charset.MalformedInputException: Input length = 2
  20. Pbd反编译(PBD文件变为PBL)(pbdviewer)特性

热门文章

  1. 一个很好地List实现源码
  2. DevOps和SRE有什么不同,每个意味着什么
  3. 用Android Studio开发Java App (Runnable Jar)
  4. Python中的网络编程之UDP
  5. 网络编程套接字(四)
  6. 视频直播/远程会议中的AI关键技术探索应用
  7. 展望2018:WebRTC技术现状、应用开发与前景
  8. 基于Kubeflow建立的星辰算力训练平台背后的技术架构
  9. 综述 | 生成对抗网络(GAN)在图网络中的应用
  10. 原理篇 | 推荐系统之矩阵分解模型