Kotlin学习笔记之 21 解构声明

931 阅读1分钟

首发于公众号: DSGtalk1989

21.解构声明

我们可以直接通过括号包含变量的方式进行数据获取

  • 一般使用

    比如有个类Person有两个属性name``age

    我们一般的获取方式是这样的

    class Person{
          var name = "1"
          var age = 4
      }
      
      
      fun main() {
          val person = Person()
          val name = person.name
          val age = person.age
      }
    

    我们白白产生了一个person对象,造成了浪费。这时候我们就可以使用解构声明

    需要去重载操作符方法componentN,所有componentN方法指向的就是括号中从第一个开始的参数

    class Person{
          var name = "1"
          var age = 4
          operator fun component1() = name
          operator fun component2() = age
      }
      
      
      fun main() {
          val (a,b) = Person()
          println(a)
          println(b)
      }
    
  • map使用

    map中使用的比较多的解构是这样的

    for ((key, value) in map) {
         // 使用 key 和 value 执行某种操作
      }
    
  • 有些参数用不到

    比如上面的例子,我们只需要用到name,而不用age,在kotlin1.1之后支持用下划线略过不需要使用的参数,类似于lambda中不需要使用到的出参。

    val (_,b) = Person()
    
  • lambda中的解构

    从kotlin1.1开始支持lambda中有解构

     { a -> ... } // 这里是一个参数
      { a, b -> ... } // 这里是两个参数
      { (a, b) -> ... } // 这里是将一个参数解构为两个参数
      { (a, b), c -> ... } // 这里是将一个参数解构为两个参数, 然后是另一个参数
    

    我们针对上面的PersonMap分别举例子

    val personArray = arrayOf(Person())
      
      personArray.filter { 
          (name, age) -> name.startsWith("1") || age > 1
      }
    
      val map = mapOf("key" to 1, "haha" to 2)
      map.mapKeys {
          (key, value) -> println("key  : $key  value : $value")
      }