多重声明

有时候可以通过给对象插入多个成员函数做区别是很方便的,比如:

  1. val (name, age) = person

这种语法叫多重声明。多重声明一次创建了多个变量。我们声明了俩个新变量:name age 并且可以独立使用:

  1. println(name)
  2. println(age)

多重声明被编译成下面的代码:

  1. val name = persion.component1()
  2. val age = persion.component2()

component1() component2()是另一个转换原则的例子。任何类型都可以在多重分配的右边。当然了,也可以有 component3() component4() 等等

多重声明也可以在 for 循环中用

  1. for ((a, b) in collection) { ... }

参数 abcomponent1() component2() 的返回值

例子:一个函数返回俩个值

要是一个函数想返回俩个值。比如,一个对象结果,一个是排序的状态。在 Kotlin 中的一个紧凑的方案是声明 data 类并返回实例:

  1. data class Result(val result: Int, val status: Status)
  2. fun function(...): Result {
  3. //...
  4. return Result(result, status)
  5. }
  6. val (result, status) = function(...)

数据类自动声明 componentN() 函数

注意:也可以使用标准类 Pair 并让函数返回 ‘Pair‘,但可读性不是很强

例子:多重声明和 Map

转换 map 的最好办法可能是下面这样:

  1. for ((key, value) in map) {
  2. }

为了让这个可以工作,我们需要

通过提供 iterator() 函数序列化呈现 map
通过 component1()component1() 函数是把元素成对呈现

事实上,标准库提供了这样的扩展:

  1. fun <K, V> Map<K, V>.iterator(): Iterator<Map.Entry<K, V>> = entrySet().iterator()
  2. fun <K, V> Map.Entry<K, V>.component1() = getKey()
  3. fun <K, V> Map.Entry<K, V>.component2() = getValue()

因此你可以用 for 循环方便的读取 map (或者其它数据集合)